[Java Backend Zero to Hello] [Phase 3] BÀI 3.4: MAVEN NÂNG CAO
📚 Series: Java Backend Zero to Hello 📂 Phân đoạn: Phase 3: Công cụ & Build tools 📖 Nội dung: BÀI 3.4: MAVEN NÂNG CAO 💡 Khóa học lập trình Backend Java & Spring Boot chuẩn doanh nghiệp từ con số 0.
BÀI 3.4: MAVEN NÂNG CAO
Mục tiêu
- Quản lý version với properties
- Tạo Multi-module project
- Sử dụng Profile
- Tích hợp với CI/CD
1. DEPENDENCY MANAGEMENT
1.1 Quản lý version tập trung
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Không cần version -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
1.2 BOM (Bill of Materials)
Import BOM để quản lý version cho cả nhóm dependency.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. MULTI-MODULE PROJECT
2.1 Cấu trúc
parent-project/
├── pom.xml (packaging: pom)
├── common/
│ ├── pom.xml
│ └── src/
├── service/
│ ├── pom.xml
│ └── src/
└── web/
├── pom.xml
└── src/
2.2 Parent POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>service</module>
<module>web</module>
</modules>
<properties>
<java.version>17</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.3 Child POM
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>service</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
</dependency>
</dependencies>
</project>
2.4 Build multi-module
mvn clean install # Build tất cả module
mvn -pl service test # Chỉ build module service
mvn -pl web -am test # Build web và dependencies
3. PROFILE
Cấu hình khác nhau cho từng môi trường.
3.1 Khai báo profile
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>development</env>
<db.url>jdbc:mysql://localhost:3306/dev_db</db.url>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>production</env>
<db.url>jdbc:mysql://prod-server:3306/prod_db</db.url>
</properties>
</profile>
</profiles>
3.2 Sử dụng
mvn package -Pdev # Dùng profile dev
mvn package -Pprod # Dùng profile prod
mvn package -Pdev,prod # Nhiều profile
3.3 Profile với build khác nhau
<profiles>
<profile>
<id>prod</id>
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
4. RESOURCE FILTERING
Thay thế biến trong file resource.
4.1 Cấu hình
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
4.2 File application.properties
app.name=MyApp
app.version=${project.version}
db.url=${db.url}
4.3 Kết quả
app.name=MyApp
app.version=1.0.0-SNAPSHOT
db.url=jdbc:mysql://localhost:3306/dev_db
5. CUSTOM PLUGIN
5.1 Tạo Mojo
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@Mojo(name = "greet", defaultPhase = LifecyclePhase.COMPILE)
public class GreetMojo extends AbstractMojo {
@Parameter(property = "greet.name", defaultValue = "World")
private String name;
public void execute() throws MojoExecutionException {
getLog().info("Hello, " + name + "!");
}
}
5.2 Sử dụng
<plugin>
<groupId>com.example</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<name>An</name>
</configuration>
</plugin>
mvn my-plugin:greet
6. MAVEN WRAPPER
Đảm bảo mọi người dùng cùng version Maven.
# Tạo wrapper
mvn wrapper:wrapper
# Sử dụng
./mvnw clean install # Linux/Mac
mvnw.cmd clean install # Windows
7. SETTINGS.XML
Cấu hình ở ~/.m2/settings.xml:
<settings>
<!-- Local repository -->
<localRepository>D:/maven-repo</localRepository>
<!-- Mirror -->
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<!-- Proxy -->
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
</proxy>
</proxies>
<!-- Server credentials -->
<servers>
<server>
<id>my-server</id>
<username>user</username>
<password>pass</password>
</server>
</servers>
</settings>
8. RELEASE PLUGIN
Tự động hóa quy trình release.
# Chuẩn bị release
mvn release:prepare
# Thực hiện release
mvn release:perform
Quy trình:
- Kiểm tra không có commit chưa push
- Thay đổi version từ SNAPSHOT → release
- Tag version
- Build và deploy
- Tăng version mới (SNAPSHOT)
9. BÀI TẬP THỰC HÀNH
Bài 1: Multi-module project
Tạo project:
parent(pom)model(jar) - chứa entityrepository(jar) - chứa DAOservice(jar) - chứa business logicapp(jar) - main class
Bài 2: Profile cho dev/prod
Tạo 2 profile với database URL khác nhau.
Bài 3: Resource filtering
Tạo file config với version tự động thay thế.
10. TÓM TẮT
| Khái niệm | Mô tả |
|---|---|
dependencyManagement |
Quản lý version tập trung |
| BOM | Import version cho nhóm dependency |
| Multi-module | Project có nhiều module con |
| Profile | Cấu hình theo môi trường |
| Resource filtering | Thay biến trong resource |
| Maven Wrapper | Đảm bảo cùng version Maven |
| Release Plugin | Tự động hóa release |
Bài tiếp theo: 3.5 Gradle (tùy chọn)
🧭 Điều hướng bài học
- ⬅️ Bài trước: BÀI 3.3: MAVEN CƠ BẢN
- ➡️ Bài tiếp theo: BÀI 3.5: GRADLE (TÙY CHỌN)
- 📑 Toàn bộ lộ trình: Java Backend Zero to Hello
⭐ Hãy bookmark (clip) lại series để tiện theo dõi các bài học tiếp theo nhé!
All rights reserved