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-clean→clean→post-clean - default:
process-sources→compile→process-test-sources→test-compile→test→package→verify→install→deploy - site:
pre-site→site→post-site→site-deploy
Khi chạy lệnh mvn clean package, Maven sẽ lần lượt thực hiện:
clean: Xóa thư mụctarget/resources: Xử lý tài nguyên chínhcompile: Biên dịch mã nguồn vàotarget/classestestResources: Xử lý tài nguyên kiểm thửtestCompile: Biên dịch mã kiểm thửtest: Chạy kiểm thửjar: Đóng gói thành file JARshade: Nhúng thông tinMain-ClassvàoMETA-INF/MANIFEST.MFinstall: Cài đặt bản sao không cóMain-Classvà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.