[Java Backend Zero to Hello] BÀI 3.5: GRADLE (TÙY CHỌN)
📚 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
- Tải từ: https://gradle.org/releases/
- Hoặc dùng SDKMAN, Homebrew
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