Sự khác biệt / mối quan hệ giữa các mục tiêu và giai đoạn của Maven là gì? Làm thế nào họ có liên quan với nhau?
Sự khác biệt / mối quan hệ giữa các mục tiêu và giai đoạn của Maven là gì? Làm thế nào họ có liên quan với nhau?
Câu trả lời:
Các mục tiêu được thực hiện theo từng giai đoạn giúp xác định mục tiêu thứ tự được thực hiện. Hiểu rõ nhất về điều này là xem xét các ràng buộc vòng đời Maven mặc định cho thấy mục tiêu nào được chạy trong các giai đoạn theo mặc định. Các mục tiêu giai đoạn biên dịch sẽ luôn được thực hiện trước các mục tiêu của giai đoạn thử nghiệm sẽ luôn được thực hiện trước các mục tiêu của giai đoạn gói, v.v.
Một phần của sự nhầm lẫn trở nên trầm trọng hơn bởi thực tế là khi bạn thực hiện maven, bạn có thể chỉ định một mục tiêu hoặc một giai đoạn. Nếu bạn chỉ định một pha thì maven sẽ chạy tất cả các pha cho đến pha bạn đã chỉ định theo thứ tự (ví dụ: nếu bạn chỉ định gói, trước tiên nó sẽ chạy qua pha biên dịch và sau đó là pha thử nghiệm và cuối cùng là pha gói) và với từng pha chạy tất cả các mục tiêu gắn liền với giai đoạn đó.
Khi bạn tạo một thực thi plugin trong tệp xây dựng Maven của mình và bạn chỉ xác định mục tiêu thì nó sẽ liên kết mục tiêu đó với một giai đoạn mặc định nhất định. Ví dụ: mục tiêu jaxb: xjc liên kết theo mặc định với pha tạo tài nguyên. Tuy nhiên, khi bạn chỉ định thực hiện, bạn cũng có thể chỉ định rõ ràng giai đoạn cho mục tiêu đó.
Nếu bạn chỉ định mục tiêu khi bạn thực hiện Maven thì nó sẽ chạy mục tiêu đó và chỉ mục tiêu đó. Nói cách khác, nếu bạn chỉ định mục tiêu jar: jar, nó sẽ chỉ chạy mục tiêu jar: jar để đóng gói mã của bạn vào một jar. Nếu trước đây bạn chưa chạy mục tiêu biên dịch hoặc chuẩn bị mã được biên dịch theo một cách khác thì điều này rất có thể thất bại.
mvn archetype:generate
, và trong trường hợp đó, maven chỉ thực hiện mục tiêu?
mvn test
ran : --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test
, trong khi mvn compiler:testCompile
chỉ chạy --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
chạy --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
không thành công với Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase
( MvnPhase
lớp đang được kiểm tra được tham chiếu trong lớp kiểm tra). Rõ ràng các pha không được gọi nếu mục tiêu được gọi rõ ràng.
Vòng đời là một chuỗi các giai đoạn được đặt tên .
Các giai đoạn thực hiện tuần tự. Thực hiện một giai đoạn có nghĩa là thực hiện tất cả các giai đoạn trước đó.Plugin là một tập hợp các mục tiêu còn được gọi là MOJO ( M aven O ld J ava O bject).
Tương tự: Plugin là một lớp và các mục tiêu là các phương thức trong lớp.
Maven dựa trên khái niệm trung tâm của Build Life C chu kỳ . Bên trong mỗi chu kỳ xây dựng cuộc sống có các giai đoạn xây dựng và bên trong mỗi giai đoạn xây dựng có các mục tiêu xây dựng .
Chúng tôi có thể thực hiện một giai đoạn xây dựng hoặc xây dựng mục tiêu. Khi thực hiện giai đoạn xây dựng, chúng tôi thực hiện tất cả các mục tiêu xây dựng trong giai đoạn xây dựng đó. Mục tiêu xây dựng được gán cho một hoặc nhiều giai đoạn xây dựng. Chúng tôi cũng có thể thực hiện một mục tiêu xây dựng trực tiếp.
Có ba chu trình xây dựng chính được tích hợp sẵn :
Mỗi vòng đời xây dựng được tạo thành từ các giai đoạn
Ví dụ: default
vòng đời bao gồm các Giai đoạn Xây dựng sau :
◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
Vì vậy, để đi qua các giai đoạn trên, chúng ta chỉ cần gọi một lệnh:
mvn <phase> { Ex: mvn install }
Đối với lệnh trên, bắt đầu từ giai đoạn đầu tiên, tất cả các giai đoạn được thực hiện tuần tự cho đến giai đoạn 'cài đặt'. mvn
có thể thực hiện một mục tiêu hoặc một giai đoạn (hoặc thậm chí nhiều mục tiêu hoặc nhiều giai đoạn) như sau:
mvn clean install plugin:goal
Tuy nhiên, nếu bạn muốn tùy chỉnh tiền tố được sử dụng để tham chiếu plugin của mình, bạn có thể chỉ định trực tiếp tiền tố thông qua tham số cấu hình trên POMmaven-plugin-plugin
trong plugin của bạn .
Một giai đoạn xây dựng được tạo thành từ các mục tiêu plugin
Hầu hết các chức năng của Maven là trong các plugin. Một plugin cung cấp một bộ các mục tiêu có thể được thực hiện bằng cú pháp sau:
mvn [plugin-name]:[goal-name]
Ví dụ, một dự án Java có thể được biên dịch với mục tiêu biên dịch của trình biên dịch-plugin bằng cách chạy mvn compiler:compile
.
Xây dựng vòng đời là một danh sách các giai đoạn được đặt tên có thể được sử dụng để ra lệnh thực hiện mục tiêu.
Các mục tiêu được cung cấp bởi các plugin có thể được liên kết với các giai đoạn khác nhau của vòng đời. Ví dụ: theo mặc định, mục tiêu compiler:compile
được liên kết với compile
pha , trong khi mục tiêu surefire:test
được liên kết với test
pha . Hãy xem xét các lệnh sau:
mvn test
Khi lệnh trước được thực thi, Maven chạy tất cả các mục tiêu được liên kết với từng pha lên đến và bao gồm cả test
pha. Trong trường hợp như vậy, Maven chạy resources:resources
mục tiêu liên quan đến process-resources
pha, sau đó compiler:compile
, và cứ thế cho đến khi cuối cùng nó chạy được surefire:test
mục tiêu.
Tuy nhiên, mặc dù giai đoạn xây dựng chịu trách nhiệm cho một bước cụ thể trong vòng đời xây dựng, cách thức thực hiện các trách nhiệm đó có thể khác nhau. Và điều này được thực hiện bằng cách khai báo các mục tiêu plugin bị ràng buộc với các giai đoạn xây dựng đó.
Mục tiêu plugin đại diện cho một nhiệm vụ cụ thể (tốt hơn giai đoạn xây dựng) góp phần xây dựng và quản lý dự án. Nó có thể bị ràng buộc với không hoặc nhiều giai đoạn xây dựng. Một mục tiêu không bị ràng buộc với bất kỳ giai đoạn xây dựng nào có thể được thực hiện bên ngoài vòng đời xây dựng bằng cách gọi trực tiếp. Thứ tự thực hiện phụ thuộc vào thứ tự mà (các) mục tiêu và giai đoạn xây dựng được gọi. Ví dụ, hãy xem xét lệnh dưới đây. Các đối số clean
và package
là các giai đoạn xây dựng, trong khi đó dependency:copy-dependencies
là một mục tiêu (của một plugin).
mvn clean dependency:copy-dependencies package
Nếu điều này được thực hiện, clean
giai đoạn sẽ được thực hiện trước tiên (có nghĩa là nó sẽ chạy tất cả các giai đoạn trước của vòng đời sạch, cộng với clean
chính giai đoạn đó), và sau đó là dependency:copy-dependencies
mục tiêu, trước khi thực hiện package
giai đoạn (và tất cả các giai đoạn xây dựng trước đó của nó vòng đời mặc định).
Hơn nữa, nếu một mục tiêu bị ràng buộc với một hoặc nhiều giai đoạn xây dựng, mục tiêu đó sẽ được gọi trong tất cả các giai đoạn đó.
Hơn nữa, giai đoạn xây dựng cũng có thể có 0 hoặc nhiều mục tiêu ràng buộc với nó. Nếu một giai đoạn xây dựng không có mục tiêu ràng buộc với nó, giai đoạn xây dựng đó sẽ không thực hiện. Nhưng nếu nó có một hoặc nhiều mục tiêu ràng buộc với nó, nó sẽ thực hiện tất cả các mục tiêu đó.
Ràng buộc vòng đời tích hợp sẵn
Một số giai đoạn có các mục tiêu ràng buộc với chúng theo mặc định. Và đối với vòng đời mặc định, các ràng buộc này phụ thuộc vào giá trị bao bì.
Kiến trúc Maven:
Tài liệu tham khảo 1
Tài liệu tham khảo 2
Mẫu Eclipse cho Ánh xạ vòng đời Maven
[plugin-name]
trong ví dụ mvn [plugin-name]:[goal-name]
này là một tiền tố plugin . mvn clean install
không thể chỉ " được sử dụng trong một kịch bản đa mô-đun ". Đa mô-đun là một chủ đề hoàn toàn khác nhau.
Câu trả lời được chọn là tuyệt vời, nhưng tôi vẫn muốn thêm một cái gì đó nhỏ vào chủ đề. Sự minh họa.
Nó cho thấy rõ cách thức các giai đoạn khác nhau liên kết với các plugin khác nhau và các mục tiêu mà các plugin đó thể hiện.
Vì vậy, hãy xem xét một trường hợp chạy một cái gì đó như mvn compile
:
mvn compile
nó được ánh xạ tới một mục tiêu cụ thể, mục tiêu biên dịch.mvn compiler:compile
Do đó, giai đoạn được tạo thành từ các mục tiêu plugin .
Liên kết đến tài liệu tham khảo
mvn test
chỉ vào package
, và mvn install
chỉ vào deploy
?
jar
plugin thực sự chạy trong package
pha. Và pom trong bánh sandwich giữa các pha và plugin hơi khó hiểu (tôi giả sử nó có nghĩa là trong pom bạn có thể cấu hình các plugin nào chạy trong các pha, ngoài các ràng buộc mặc định). Nguyên tắc chung là đúng, mặc dù.
Các định nghĩa được nêu chi tiết tại trang của Maven Giới thiệu về Vòng đời xây dựng , nhưng tôi đã cố gắng tóm tắt :
Maven định nghĩa 4 mục của quá trình xây dựng:
Vòng đời
Ba built-in vòng đời (aka xây dựng vòng đời ): default
, clean
, site
. ( Tham khảo vòng đời )
Giai đoạn
Mỗi chu kỳ được tạo thành từ giai đoạn , ví dụ như đối với default
vòng đời: compile
, test
, package
, install
,, vv
Cắm vào
Một vật phẩm cung cấp một hoặc nhiều mục tiêu.
Dựa trên các mục tiêu của plugin loại ( jar
, war
v.v.) được ràng buộc theo các giai đoạn theo mặc định. ( Ràng buộc vòng đời tích hợp )
Mục tiêu
Nhiệm vụ (hành động) được thực thi. Một plugin có thể có một hoặc nhiều mục tiêu.
Một hoặc nhiều mục tiêu cần được chỉ định khi định cấu hình plugin trong POM . Ngoài ra, trong trường hợp plugin không có pha mặc định được xác định, (các) mục tiêu được chỉ định có thể được liên kết với một pha.
Maven có thể được gọi với:
clean
, package
)<plugin-prefix>:<goal>
(ví dụ dependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(ví dụ org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)với một hoặc nhiều kết hợp của bất kỳ hoặc tất cả, ví dụ:
mvn clean dependency:copy-dependencies package
Build Phase
, tôi nghĩ về nó như một giai đoạn khác trong vòng đời và nó làm tôi bối rối.
Tôi tin rằng một câu trả lời tốt đã được cung cấp, nhưng tôi muốn thêm một sơ đồ dễ tiếp theo của sự khác nhau 3 vòng đời ( build
, clean
và site
) và các giai đoạn trong mỗi.
Các pha in đậm - là các pha chính thường được sử dụng.
generate-resources
xuất hiện hai lần và generate-sources
mất tích.
Tín dụng cho Sandeep Jindal và Premraj. Giải thích của họ giúp tôi hiểu sau khi bối rối về điều này trong một thời gian.
Tôi đã tạo một số ví dụ mã đầy đủ và một số giải thích đơn giản tại đây https://www.surasint.com/maven-life- Motorcycle-phase- and-goal- easy-explained/ . Tôi nghĩ rằng nó có thể giúp người khác hiểu.
Tóm lại từ liên kết, Bạn không nên cố gắng hiểu cả ba cùng một lúc, trước tiên bạn nên hiểu mối quan hệ trong các nhóm này:
1. Vòng đời vs Pha
Vòng đời là tập hợp các pha theo trình tự xem tại đây Tài liệu tham khảo Vòng đời . Khi bạn gọi một pha , nó cũng sẽ gọi tất cả các pha trước nó.
Chẳng hạn, vòng đời sạch sẽ có 3 giai đoạn ( tiền sạch, sạch, hậu sạch ).
mvn clean
Nó sẽ gọi trước sạch sẽ và sạch sẽ .
2. Plugin vs Mục tiêu
Mục tiêu giống như một hành động trong Plugin . Vì vậy, nếu plugin là một lớp, mục tiêu là một phương pháp.
bạn có thể gọi một mục tiêu như thế này:
mvn clean:clean
Điều này có nghĩa là "gọi mục tiêu sạch, trong plugin sạch" (Không có gì liên quan đến giai đoạn sạch ở đây. Đừng để từ "sạch" làm bạn bối rối, chúng không giống nhau!)
3. Bây giờ mối quan hệ giữa Giai đoạn & Mục tiêu:
Pha có thể (trước) liên kết đến (các) Mục tiêu . Ví dụ, thông thường, pha sạch sẽ liên kết với mục tiêu sạch. Vì vậy, khi bạn gọi lệnh này:
mvn clean
Nó sẽ gọi pha sạch trước và pha sạch liên kết với mục tiêu sạch: sạch.
Nó gần giống như:
mvn pre-clean clean:clean
Chi tiết hơn và các ví dụ đầy đủ có trong https://www.surasint.com/maven-life- Motorcycle-phase- and- goal-easy-explained/
Thuật ngữ làm việc của Maven có các giai đoạn và mục tiêu.
Pha: Pha Maven là một tập hợp hành động được liên kết với 2 hoặc 3 mục tiêu
exmaple: - nếu bạn chạy mvn sạch
đây là giai đoạn sẽ thực hiện mục tiêu mvn sạch: sạch
Mục tiêu: Mục tiêu của Maven giới hạn với pha
để tham khảo http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Có ba vòng đời xây dựng tích hợp sau:
Mặc định vòng đời -> [xác thực, khởi tạo, tạo nguồn, xử lý nguồn, tạo tài nguyên, xử lý tài nguyên, biên dịch, lớp quy trình, tạo nguồn kiểm tra, kiểm tra nguồn-quy trình, tạo tài nguyên kiểm tra, xử lý -test-resource, test-compile, process-test-class, test, ready-pack, pack, pre-integration-test, integration-test, post-integration-test, xác minh, cài đặt, triển khai]
Vòng đời sạch sẽ -> [làm sạch trước, sạch sẽ, sau sạch sẽ]
Trang web vòng đời -> [trang web trước, trang web, sau trang web, triển khai trang web]
Luồng là tuần tự, ví dụ, đối với vòng đời mặc định , nó bắt đầu bằng xác thực , sau đó khởi tạo và cứ thế ...
Bạn có thể kiểm tra vòng đời bằng cách bật chế độ gỡ lỗi mvn
tức làmvn -X <your_goal>