Cấu Hình Chi Tiết Maven: settings.xml và pom.xml

Tổng Quan Về File Cấu Hình

Hệ thống Maven quản lý dự án dựa trên hai file cấu hình cốt lõi là settings.xmlpom.xml. Việc hiểu rõ vị trí và chức năng của từng file là bước đầu tiên để tối ưu hóa quy trình build.

  • Global Settings: File settings.xml nằm trong thư mục cài đặt Maven (ví dụ: conf/settings.xml), áp dụng cho tất cả người dùng trên máy đó.
  • User Settings: File settings.xml trong thư mục home của người dùng (thường là .m2/settings.xml), chỉ có hiệu lực với user hiện tại.
  • Project Settings: File pom.xml nằm ở root của dự án, cấu hình riêng cho project đó.

Nguyên tắc ưu tiên cấu hình được áp dụng theo thứ tự: pom.xml > User Settings > Global Settings. Cấu hình ở mức dự án sẽ ghi đè các cấu hình ở mức người dùng và toàn cục.

Chi Tiết File settings.xml

File này chủ yếu quản lý môi trường chạy Maven, kho lưu trữ và xác thực máy chủ.

1. Cấu hình kho lưu trữ cục bộ (LocalRepository)

Thay đổi đường dẫn mặc định nơi Maven lưu trữ các dependency đã tải về.

<localRepository>/opt/maven/storage</localRepository>

2. Chế độ tương tác và offline

Kiểm soát việc Maven có yêu cầu input từ người dùng hay chạy chế độ offline hay không.

<interactiveMode>false</interactiveMode>
<offline>false</offline>

3. Nhóm plugin (pluginGroups)

Cho phép sử dụng plugin mà không cần khai báo đầy đủ groupId trong command line.

<pluginGroups>
    <pluginGroup>org.sonatype.plugins</pluginGroup>
</pluginGroups>

4. Xác thực máy chủ (servers)

Thông tin đăng nhập để deploy artifact lên private repository. ID ở đây phải khớp với ID trong distributionManagement của pom.xml.

<servers>
    <server>
        <id>internal-nexus-release</id>
        <username>deployer</username>
        <password>securePassword123</password>
        <filePermissions>664</filePermissions>
        <directoryPermissions>775</directoryPermissions>
    </server>
    <server>
        <id>internal-nexus-snapshot</id>
        <username>ci-user</username>
        <password>ciPass</password>
    </server>
</servers>

5. Cấu hình Mirror

Chuyển hướng yêu cầu tải dependency sang máy chủ khác để tăng tốc độ.

<mirror>
    <id>public-mirror</id>
    <name>Public Mirror Repo</name>
    <url>https://repo.maven.apache.org/maven2</url>
    <mirrorOf>*</mirrorOf>
</mirror>

6. Profiles và Activation

Profiles cho phép định nghĩa các cấu hình khác nhau cho các môi trường khác nhau. Activation xác định khi nào profile được kích hoạt.

<profiles>
    <profile>
        <id>corp-env</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>17</jdk>
        </activation>
        <repositories>
            <repository>
                <id>nexus-public</id>
                <url>http://nexus.internal.com/repository/maven-public/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
        </repositories>
        <properties>
            <sonar.host.url>http://sonar.internal.com:9000</sonar.host.url>
        </properties>
    </profile>
</profiles>

Để kích hoạt profile thủ công, sử dụng thẻ activeProfiles:

<activeProfiles>
    <activeProfile>corp-env</activeProfile>
</activeProfiles>

Chi Tiết File pom.xml

File Project Object Model mô tả dự án, các phụ thuộc và quy trình build.

1. Tọa độ dự án (Coordinates)

Xác định duy nhất dự án trong hệ sinh thái Maven.

<modelVersion>4.0.0</modelVersion>
<groupId>org.example.solution</groupId>
<artifactId>core-service</artifactId>
<version>2.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

Nếu dự án kế thừa, cần khai báo thêm thẻ parent với thông tin groupId, artifactId, version và relativePath của cha.

2. Thuộc tính (Properties)

Định nghĩa các biến để sử dụng lại trong suốt file pom, giúp dễ dàng quản lý version.

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <spring.framework.version>3.1.5</spring.framework.version>
</properties>

3. Quản lý phụ thuộc (Dependencies)

Khai báo các thư viện cần thiết. Scope xác định phạm vi sử dụng của dependency.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.framework.version}</version>
        <scope>compile</scope>
        <optional>false</optional>
    </dependency>
</dependencies>

Sử dụng dependencyManagement trong pom cha để thống nhất version mà không cần import ngay lập tức.

4. Cấu hình Build và Plugin

Quản lý các plugin thực thi trong quá trình build.

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.framework.version}</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
        </plugin>
    </plugins>
</build>

5. Phân phối (Distribution Management)

Cấu hình nơi deploy artifact khi chạy lệnh deploy. ID phải khớp với server trong settings.xml.

<distributionManagement>
    <repository>
        <id>internal-nexus-release</id>
        <url>http://nexus.internal.com/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>internal-nexus-snapshot</id>
        <url>http://nexus.internal.com/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

6. Profile trong dự án

Cho phép kích hoạt các cấu hình riêng biệt cho từng môi trường (dev, prod) khi build.

<profiles>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <app.environment>dev</app.environment>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>
            <app.environment>prod</app.environment>
        </properties>
    </profile>
</profiles>

Cơ Chế Tải Kho Lưu trữ và Mirror

Khi Maven cần một dependency, nó sẽ tìm kiếm theo thứ tự ưu tiên sau:

  1. Kiểm tra kho lưu trữ cục bộ (Local Repository).
  2. Kiểm tra các remote repository được cấu hình trong settings.xml (global/user).
  3. Kiểm tra các remote repository được cấu hình trong pom.xml của dự án.
  4. Kết nối đến Central Repository mặc định nếu không tìm thấy ở các bước trên.

Cơ chế Mirror hoạt động như một lớp trung gian. Nếu cấu hình mirrorOf*, tất cả yêu cầu tải về sẽ được chuyển hướng qua mirror đó. Nếu đặt là central, chỉ mirror kho trung tâm. Có thể loại trừ một số kho khỏi mirror bằng cú pháp *,!repo-id. Việc cấu hình mirror giúp tăng tốc độ tải về nhưng cần đảm bảo mirror đó đồng bộ đầy đủ để tránh lỗi thiếu dependency.

Thẻ: Maven settings.xml pom.xml dependency-management build-automation

Đăng vào ngày 6 tháng 7 lúc 06:48