0

[Java Backend Zero to Hello] BÀI 3.4: MAVEN NÂNG CAO

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 32/86


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:

  1. Kiểm tra không có commit chưa push
  2. Thay đổi version từ SNAPSHOT → release
  3. Tag version
  4. Build và deploy
  5. 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 entity
  • repository (jar) - chứa DAO
  • service (jar) - chứa business logic
  • app (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 Series

⬅️ Bài trước: BÀI 3.3: MAVEN CƠ BẢN

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

➡️ Bài tiếp theo: BÀI 3.5: GRADLE (TÙY CHỌN)


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í