Mục lục
Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về Maven Build Lifecycle và các phase của nó. Ngoài ra chúng ta cũng cùng nhau phân tích mối quan hệ giữa Goal và Phase trong Maven.
Maven Build LifeCycle
LifeCycle của Maven tuân thủ theo một nguyên tắc cụ thể để triển khai và phân phố dự án hiện hành. Có 3 vòng đời được xây dựng sẵn trong Maven.
- default: Đây là lifecycle chính chịu trách nhiệm cho việc triển khai dự án.
- clean: Xoá tất cả những gì được snh ra từ những lần build trước.
- site: Khởi tạo project document.
Mỗi lifecycle trên chứa một chuỗi các phase cụ thể. Ví dụ default build lifecycle chứa 23 phase, clean chứa 3 phase và site chứa 4 phase.
Maven Phase
Một Maven Phase đại diện cho một giai đoạn cụ thể trong Maven Build Lifecycle. Mỗi phase chịu trách nhiệm cho một công việc cụ thể. Dưới đây là một số phase quan trọng trong default build lifecycle.
- validate: Kiểm tra tất cả các thông tin cần thiết trước khi buid
- compile: Biên dịch mã nguồn
- test-compile: Biên dịch mã nguồn test
- test: Thực thi unit test
- package: Đóng gói mã nguồn đã biên dịch sang một dạng jar, war dùng để phân phối đến các máy khác.
- integration-test: Xử lý triển khai các package cần thiết để chạy intergration test.
- install: Tải package(được đóng gói bởi package phase) xuống local repository
- deploy: Sao chép package đến remote repository
Các bạn có thể tham khảo danh sách đầy đủ các phase trong Maven tại đây.
Các phase được thực hiện theo một thứ tự cụ thể. Điều này có nghĩa là nếu chúng ta chạy một phase cụ thể bằng lệnh:
mvn <PHASE>
Maven sẽ không chỉ thực thi phase được chỉ định mà nó còn thực thi tất cả các phase trước nó. Ví dụ nếu chúng ta thực thi deploy phase đây là phase cuối cùng trong default build lifecycle thì có nghĩa là tất cả các phase trong đó sẽ được thực thi bao gồm validate, compile, package, v.v
Maven Goal
Mỗi Phase chứa một danh sách các goal sắp sếp theo thứ tự, mỗi goal sẽ chịu trách nhiệm cho một nhiệm vụ cụ thể. Khi chúng ta thực thi một phase thì tất cả các goal của nó sẽ thực thi theo thứ tự định sẵn.
Dưới đây là một số goal của một số phase quan trọng:
- compiler:compile – compile goal từ compiler plugin được ràng buộc với compile phase.
- compiler: testCompile được ràng buộc với the test-compile phase
- surefire:test được ràng buộc vớitest phase
- install:install được ràng buộc vớiinstall phase
- jar:jar và war:war được ràng buộc với package phase
Chúng ta có thể liệt kê tất cả các goal của một phase cụ thể cùng với những plugin của nó với lệnh CMD sau:
mvn help:describe -Dcmd=PHASENAME
Ví dụ chúng ta có thể xem tất cả các goal của compile phase như sau:
mvn help:describe -Dcmd=compile
Và output
compile' is a phase corresponding to this plugin: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
Như đã đề cập ở trên, có nghĩa là compile goal từ compiler plugin bị ràng buộc với compile phase.
Maven plugin
Maven plugin là một nhóm các goal. Tuy nhiên những goal này không nhất thiết phải có trong cùng một phase.
Ví dụ: đây là cấu hình đơn giản của plugin Maven Failsafe chịu trách nhiệm chạy các integration test.
<build> <plugins> <plugin> <artifactId>maven-failsafe-plugin</artifactId> <version>${maven.failsafe.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
Như chúng ta có thể thấy, plugin Failsafe có hai goal chính được định cấu hình ở đây:
- integration-test: Chạy integration test
- verify: Xác minh kết quả
Chúng ta có thể liệt kê danh sách tất cả các goal của một plugin bằng cách:
mvn <PLUGIN>:help
Ví dụ liệt kê các goal của Failsafe plugin
mvn failsafe:help
Output
This plugin has 3 goals: failsafe:help Display help information on maven-failsafe-plugin. Call mvn failsafe:help -Ddetail=true -Dgoal=<goal-name> to display parameter details. failsafe:integration-test Run integration tests using Surefire. failsafe:verify Verify integration tests ran using Surefire.
Để chạy một goal cụ thể mà không cần thực hiện toàn bộ goal của nó chúng ta có thể sử dụng lệnh:
mvn <PLUGIN>:<GOAL>
Ví dụ: để chạy integration-test goal từ plugin Failsafe, chúng ta cần chạy:
mvn failsafe:integration-test
Build Maven Project
Để build một maven project chúng ta cần thực thi một trong các lifecycle bằng cách chạy một trong số các phase của chúng.
mvn deploy
Lệnh trên sẽ thực thi default lifecycle, ngoài ra chúng ta có thể dừng lại ở install phase.
mvn install
Nhưng thông thường chúng ta sẽ sử dụng lệnh
mvn clean install
Để làm sạch project trước bằng cách chạy clean lifecycle sau đó mới build. Chúng ta cũng có thể chạy một goal cụ thể bằng cách.
mvn compiler:compile
Compile phase thường được dùng khi chúng ta đang develop trên IDE và chưa muốn build ra file jar để deploy hay với mục đích phân phối ứng dụng.
Tóm lược
Qua bài viết chúng ta sẽ tìm hiểu về các maven build lifecycle và mối quan hệ giữa phase và goal. Hy vọng các bạn có thể nắm được kiến thức này để sử dụng maven có chủ đích hơn nhé.
Nguồn tham khảo