Cấu trúc vòng đời Maven, giai đoạn, plugin và mục tiêu thực thi

Maven tổ chức quá trình xây dựng dự án thông qua các vòng đời — những luồng công việc trừu tượng không tự thực hiện tác vụ nào. Mọi hành động cụ thể đều do các plugin đảm nhiệm. Có thể hình dung vòng đời như giao diện (interface), còn plugin là lớp triển khai (implementation).

Maven định nghĩa ba vòng đời độc lập: clean, default, và site.

Giai đoạn trong vòng đời

Mỗi vòng đời bao gồm nhiều giai đoạn được sắp xếp theo thứ tự cố định, trong đó giai đoạn sau phụ thuộc vào kết quả của giai đoạn trước.

  • clean: pre-cleancleanpost-clean
  • default: process-sourcescompileprocess-test-sourcestest-compiletestpackageverifyinstalldeploy
  • site: pre-sitesitepost-sitesite-deploy

Khi chạy lệnh mvn clean package, Maven sẽ lần lượt thực hiện:

  1. clean: Xóa thư mục target/
  2. resources: Xử lý tài nguyên chính
  3. compile: Biên dịch mã nguồn vào target/classes
  4. testResources: Xử lý tài nguyên kiểm thử
  5. testCompile: Biên dịch mã kiểm thử
  6. test: Chạy kiểm thử
  7. jar: Đóng gói thành file JAR
  8. shade: Nhúng thông tin Main-Class vào META-INF/MANIFEST.MF
  9. install: Cài đặt bản sao không có Main-Class vào kho local

Để kích hoạt plugin shade, cần khai báo trong pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.example.App</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

Tiền tố plugin

Lệnh mvn dependency:tree tương đương với mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree. Ở đây, dependency là tiền tố rút gọn cho plugin chính thức — nhóm mặc định là org.apache.maven.plugins, phiên bản được kế thừa từ Super POM.

Gắn kết mặc định giữa giai đoạn và mục tiêu plugin

Ví dụ: mvn clean tự động gọi mục tiêu maven-clean-plugin:clean — đây là ràng buộc nội tại do Maven định nghĩa sẵn.

Gắn kết tùy chỉnh

Để tạo gói mã nguồn khi build, ta có thể gắn mục tiêu jar-no-fork của maven-source-plugin vào giai đoạn verify:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Lưu ý: Một số mục tiêu đã được gắn mặc định vào giai đoạn cụ thể. Ví dụ, jar-no-fork mặc định gắn với package, nên dù bỏ thẻ <phase>, nó vẫn được thực thi.

Tham số cấu hình plugin

Hầu hết mục tiêu plugin đều hỗ trợ tham số tùy chỉnh.

  • Qua dòng lệnh: mvn install -Dmaven.test.skip=true
  • Cấu hình toàn cục trong POM: Thiết lập áp dụng cho mọi mục tiêu của plugin:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

Cấu hình này ảnh hưởng đến cả compile lẫn testCompile. Nếu muốn thiết lập riêng cho từng mục tiêu, cần khai báo trong khối <execution> tương ứng.

Thẻ: Maven build-lifecycle plugins java-build-tools pom-configuration

Đăng vào ngày 12 tháng 9 lúc 22:21