Maven: Vòng đời so với Giai đoạn so với Plugin so với Mục tiêu
Trả lời muộn chỉ để làm rõ một mức độ chi tiết khác còn thiếu trong chuỗi này: số lần thực thi (của một mục tiêu), là những đơn vị nhỏ nhất của một bản dựng Maven.
Do đó, chúng tôi có các chu trình xây dựng (về cơ bản, tập hợp các hành động cho một mục tiêu tổng thể cụ thể), bao gồm các giai đoạn (mức độ chi tiết thấp hơn, một bước chu kỳ), có thể gọi ra một tập hợp các mục tiêu được định cấu hình do một số plugin nhất định cung cấp . Có nghĩa là, Maven (cũng là) một trình thực thi plugin, mỗi plugin có thể đưa ra một hoặc nhiều mục tiêu. Sau đó, bạn (cũng) quyết định mục tiêu nào được gắn với giai đoạn nào, hầu hết các lần trong vòng đời mặc định (không có bất kỳ, nghĩa là mặc định). Nhưng bạn thực sự có thể có một cấp độ khác: thực thi (có cùng mục tiêu, từ cùng một plugin hoặc các mục tiêu khác nhau từ các plugin khác nhau)
Một bức tranh tôi đã chuẩn bị để nối lại toàn bộ
Và thực sự đây là cách Maven hiển thị nó (đơn vị công việc nhỏ nhất của nó) thông qua chuỗi duy nhất trong nhật ký xây dựng của nó:
plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name
Ví dụ, chúng tôi sẽ có:
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---
Điều này thực sự có nghĩa là (thông qua các mức độ chi tiết khác nhau):
- trong
compile
giai đoạn (không được đề cập, rất tiếc)>
- Tôi đang gọi plugin Maven Compiler (
artifactId
và version
)>
- Tôi đang gọi
compile
mục tiêu của nó >
- như được định nghĩa bởi sự
default-compile
thực thi
Nó là duy nhất vì thực sự bạn có thể có cùng một mục tiêu (của cùng một plugin) bị ràng buộc vào các giai đoạn khác nhau hoặc đến cùng một giai đoạn nhưng trong các lần thực thi khác nhau (nghĩa là với các cấu hình khác nhau). Các maven-compiler-plugin
ví dụ, cũng được sử dụng trong test-compile
giai đoạn (giai đoạn khác nhau) để mã kiểm tra biên dịch (thông qua nó testCompile
khung thành) trong một thực thi khác nhau ( default-testCompile
). Bạn cũng có thể biên dịch (sử dụng cùng một plugin và mục tiêu) một số mã được tạo tự động trong một giai đoạn khác như được xác định bởi một thực thi mà bạn đã chỉ định trong POM (và có thể là một cấu hình khác).
Các thực thi mặc định được cung cấp bên ngoài thông qua ràng buộc đóng gói Maven , nghĩa là, theo mặc định (và thực thi quy ước về cấu hình) Maven đã gọi ra các mục tiêu nhất định (của các plugin tiêu chuẩn) trong các giai đoạn nhất định. Id thực thi của các lệnh gọi mặc định này được xác định theo các quy ước nhất định .
Điều này cũng giải thích tại sao nếu bạn thực sự muốn ghi đè một hành vi mặc định (ràng buộc) của một bản dựng Maven, bạn cần chỉ định (ghi đè) chính xác cùng một id thực thi trong POM của mình cho cùng một plugin. Ví dụ, bạn có thể bỏ qua quá trình biên dịch chỉ đơn giản là xác định một quá trình thực thi của maven-compiler-plugin
cùng một default-compile
id nhưng bị ràng buộc với một giai đoạn không tồn tại (hoặc một giai đoạn trống).
Nói ngắn gọn : một lệnh thực thi sẽ cho Maven biết (các) mục tiêu nào sẽ thực thi với cấu hình nào trong giai đoạn đó.
Một số thực thi được cung cấp theo mặc định (ràng buộc defaul), điều này giải thích tại sao phần mềm maven tối thiểu chỉ 6 dòng đã có thể làm được nhiều việc (biên dịch, kiểm tra, gói, v.v.): thực hiện các mục tiêu của các plugin tiêu chuẩn trong các giai đoạn nhất định: cấu hình. Sau đó, thông qua pom.xml
cấu hình, bạn có thể thêm nội dung (thực thi) vào bản dựng hoặc ảnh hưởng đến hành vi của các plugin đã được định cấu hình (trong trường hợp này là không có executions
phần, nhưng chỉ cần configuration
là đủ).
Có, bạn có thể bỏ qua các chu kỳ xây dựng (và các giai đoạn của chúng) và trực tiếp gọi ra các mục tiêu (của các plugin). Hãy tưởng tượng như sau:
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
(LƯU Ý: bạn cũng có thể gọi nội tuyến chỉ trong một cuộc gọi)
Ở đây chúng tôi đang biên dịch mã ứng dụng, mã kiểm tra, thực thi kiểm tra và đóng gói: hãy tưởng tượng điều này sẽ thủ công, dễ xảy ra lỗi, lặp đi lặp lại và tốn thời gian như thế nào. Quy ước về cấu hình giúp chúng tôi: Maven giới thiệu các giai đoạn và chu kỳ sống của xây dựng . Vòng đời mặc định (không có tên, tức là mặc định), cung cấp một loạt các giai đoạn dựa trên các quy ước và thực tiễn tốt nhất (thần chú của Maven).
Nếu bạn muốn đạt được điều tương tự như trên, chỉ cần chạy: mvn package
và nó sẽ tự động biên dịch, kiểm tra và đóng gói dự án của bạn. Làm sao? gọi các plugin. Có nghĩa là, các giai đoạn là tập hợp thực thi plugin (mục tiêu) có ý nghĩa và có thể định cấu hình. Để làm cho nó chuẩn hơn nữa, đối với mỗi giai đoạn, trước tiên Maven sẽ gọi bất kỳ giai đoạn tiếp theo nào, vì vậy nếu bạn muốn kiểm tra, bạn sẽ chắc chắn rằng mình đã biên dịch trước.
ps lưu ý rằng khi chỉ định một số mục tiêu cho cùng một mục tiêu execution
, bạn vẫn sẽ thấy rõ ràng trong nhật ký xây dựng hai lần thực thi khác nhau (với cùng một id) cho hai mục tiêu khác nhau (do đó, vẫn là bộ giá trị duy nhất).