0

[Java Backend Zero to Hello] BÀI 3.5: GRADLE (TÙY CHỌN)

Java Backend Zero to Hello

📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 3: Công Cụ & Build Tools | Bài 33/86


BÀI 3.5: GRADLE (TÙY CHỌN)

Mục tiêu

  • Hiểu Gradle và so sánh với Maven
  • Viết build script với Groovy/Kotlin DSL
  • Quản lý dependency
  • Tạo task tùy chỉnh

1. GRADLE LÀ GÌ?

Gradle là build tool hiện đại, kết hợp ưu điểm của Maven và Ant, sử dụng ngôn ngữ DSL (Groovy hoặc Kotlin).

So sánh Maven vs Gradle

Tiêu chí Maven Gradle
Cú pháp XML Groovy/Kotlin DSL
Tốc độ build Chậm hơn Nhanh hơn (incremental)
Linh hoạt Thấp Cao
Cộng đồng Lớn Đang phát triển
Spring Boot Hỗ trợ Mặc định

2. CÀI ĐẶT

2.1 Tải Gradle

2.2 Wrapper (khuyến nghị)

gradle wrapper

Tạo gradlew và gradlew.bat để dùng Gradle mà không cần cài.


3. CẤU TRÚC PROJECT

my-project/
├── build.gradle          # Build script (Groovy)
├── settings.gradle       # Cấu hình project
├── gradle/
│   └── wrapper/
├── src/
│   ├── main/
│   │   ├── java/
│   │   └── resources/
│   └── test/
│       └── java/
└── build/                # Build output

4. BUILD.GRADLE (Groovy DSL)

4.1 Cơ bản

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.mysql:mysql-connector-j'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

4.2 Kotlin DSL

plugins {
    java
    id("org.springframework.boot") version "3.2.0"
    id("io.spring.dependency-management") version "1.1.4"
}

group = "com.example"
version = "1.0.0-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<Test> {
    useJUnitPlatform()
}

5. SETTINGS.GRADLE

rootProject.name = 'my-project'

include 'module-a', 'module-b', 'module-c'

6. DEPENDENCY

6.1 Configuration

Configuration Mô tả
implementation Compile + Runtime, không expose cho module khác
api Compile + Runtime, expose cho module khác
compileOnly Chỉ compile
runtimeOnly Chỉ runtime
testImplementation Chỉ test
testRuntimeOnly Chỉ runtime test

6.2 Ví dụ

dependencies {
    implementation 'org.apache.commons:commons-lang3:3.14.0'
    api 'com.google.guava:guava:32.1.3-jre'
    compileOnly 'org.projectlombok:lombok:1.18.30'
    runtimeOnly 'com.mysql:mysql-connector-j:8.2.0'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}

7. TASKS

7.1 Các task có sẵn

gradle build          # Build project
gradle clean          # Xóa build/
gradle compileJava    # Compile
gradle test           # Chạy test
gradle jar            # Tạo jar
gradle bootRun        # Chạy Spring Boot app
gradle dependencies   # Xem dependency tree

7.2 Custom task

task hello {
    doLast {
        println 'Hello, World!'
    }
}

task greet(type: GreetTask) {
    name = 'An'
}

class GreetTask extends DefaultTask {
    String name = 'World'

    @TaskAction
    def greet() {
        println "Hello, $name!"
    }
}

7.3 Task dependency

task compileAndTest {
    dependsOn 'compileJava', 'test'
    doLast {
        println 'Done!'
    }
}

8. MULTI-MODULE

8.1 Cấu trúc

parent/
├── settings.gradle
├── build.gradle
├── core/
│   └── build.gradle
├── service/
│   └── build.gradle
└── web/
    └── build.gradle

8.2 settings.gradle

rootProject.name = 'parent'
include 'core', 'service', 'web'

8.3 build.gradle (root)

allprojects {
    group = 'com.example'
    version = '1.0.0-SNAPSHOT'
}

subprojects {
    apply plugin: 'java'
    sourceCompatibility = '17'

    repositories {
        mavenCentral()
    }

    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
    }
}

8.4 build.gradle (module)

dependencies {
    implementation project(':core')
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

9. SO SÁNH MAVEN vs GRADLE

Maven (XML)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.0</version>
</dependency>

Gradle (Groovy)

implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'

Gradle (Kotlin)

implementation("org.springframework.boot:spring-boot-starter-web:3.2.0")

10. KHI NÀO DÙNG GRADLE?

  • ✅ Project lớn, cần build nhanh
  • ✅ Cần logic build phức tạp
  • ✅ Android (Gradle là mặc định)
  • ✅ Multi-module phức tạp
  • ❌ Team quen Maven
  • ❌ Project nhỏ, đơn giản

11. BÀI TẬP THỰC HÀNH

Bài 1: Chuyển project Maven sang Gradle

Tạo build.gradle tương ứng với pom.xml.

Bài 2: Custom task

Tạo task printVersion in ra version và build time.

Bài 3: Multi-module

Tạo project 3 module với Gradle.


12. TÓM TẮT

Khái niệm Mô tả
DSL Groovy hoặc Kotlin
build.gradle Build script
settings.gradle Cấu hình project
Task Đơn vị công việc
Configuration Loại dependency
Wrapper Đảm bảo version Gradle

Bài tiếp theo: 3.6 Logging


🧭 Điều Hướng Series

⬅️ Bài trước: BÀI 3.4: MAVEN NÂNG CAO

📋 Lộ trình tổng quan: Xem Toàn Bộ Series

➡️ Bài tiếp theo: BÀI 3.6: LOGGING


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí