Mục tiêu và giai đoạn của Maven là gì và sự khác biệt của chúng là gì?


328

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:


250

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.


11
Tôi đã tạo thói quen nói "Maven vượt qua tất cả các giai đoạn (tối đa và bao gồm cả giai đoạn đã cho)" thay vì "chạy" hoặc "thực thi" (sau này được gọi là Giới thiệu về Vòng đời xây dựng của Maven ). Như vậy phân biệt rõ ràng hơn từ mã của mục tiêu thực sự được thực thi. Nhưng đó có thể là sở thích cá nhân.
GeroldBroser phục hồi Monica

Nhưng chúng ta cũng có thể chạy các mục tiêu không thuộc về bất kỳ giai đoạn nào mvn archetype:generate, và trong trường hợp đó, maven chỉ thực hiện mục tiêu?
Quazi Irfan

1
@Pace Bạn có tham khảo cho đoạn cuối không? Tôi đã nghi ngờ điều đó và đã thử nó với một dự án đơn giản ở đây: mvn testran : --- 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:testCompilechỉ chạy --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser phục hồi Monica

4
@Pace mvn clean compiler:testCompilechạy --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompilekhô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( MvnPhaselớ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.
GeroldBroser phục hồi Monica

1
Dựa trên đầu vào từ geroldbroser và @ kekko12 Tôi đã cập nhật đoạn cuối để nói rằng, khi mục tiêu được chỉ định, chỉ mục tiêu đó được chạy và không phải tất cả các giai đoạn trước.
Pace

188

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 :

  1. mặc định
  2. dọn dẹp
  3. Địa điểm

Mỗi vòng đời xây dựng được tạo thành từ các giai đoạn

Ví dụ: defaultvò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'. mvncó 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ả testpha. Trong trường hợp như vậy, Maven chạy resources:resourcesmục tiêu liên quan đến process-resourcespha, sau đó compiler:compile, và cứ thế cho đến khi cuối cùng nó chạy được surefire:testmụ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ố cleanpackagelà các giai đoạn xây dựng, trong khi đó dependency:copy-dependencieslà 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, cleangiai đ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 cleanchính giai đoạn đó), và sau đó là dependency:copy-dependenciesmục tiêu, trước khi thực hiện packagegiai đ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:

nhập mô tả hình ảnh ở đây

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

Mẫu Eclipse cho Ánh xạ vòng đời Maven


Nếu tôi có 2 hồ sơ, tôi có thể chạy tất cả các plugin của hồ sơ 1 trước không, và sau đó là hồ sơ 2?
Ong

[plugin-name]trong ví dụ mvn [plugin-name]:[goal-name]này là một tiền tố plugin . mvn clean installkhô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.
GeroldBroser phục hồi Monica

Các mục tiêu gắn liền với cùng một giai đoạn có tuân theo bất kỳ trật tự nào không?
lươn ghEEz

5
Hầu hết các văn bản này được sao chép nguyên văn từ tài liệu Maven . Điều này cần được nêu rõ!
Lii

nguồn tuyệt vời!
Bobo

45

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:

  • Đó là giai đoạn thực thi plugin trình biên dịch với mục tiêu biên dịch
  • Trình biên dịch plugin có các mục tiêu khác nhau. Đối với mvn compilenó được ánh xạ tới một mục tiêu cụ thể, mục tiêu biên dịch.
  • Nó giống như chạy mvn compiler:compile

Do đó, giai đoạn được tạo thành từ các mục tiêu plugin .

nhập mô tả hình ảnh ở đây

Liên kết đến tài liệu tham khảo


20
Tại sao mvn testchỉ vào package, và mvn installchỉ vào deploy?
Abdull

2
Trông giống như một lỗi minh họa, cảm ơn vì đã chú ý (thành lập nó trong web).
Johnny

3
Bạn lấy hình minh họa từ đâu? Bạn đã kiểm tra bản quyền và điều khoản sử dụng?
Abdull

1
@Abdull hình ảnh được chụp từ đây carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/ (và nó cũng xuất hiện trong nhiều trang web khác) thêm nó vào câu trả lời. Cảm ơn vì đã nêu lên quan điểm này, đã không nhận thức được tầm quan trọng của nó.
Johnny

1
Các con trỏ từ các pha đến các plugin trong sơ đồ cũng không hoàn toàn đúng, jarplugin thực sự chạy trong packagepha. 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ù.
Alexander Klimetschek

43

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:

  1. 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 )

  2. Giai đoạn

    Mỗi chu kỳ được tạo thành từ giai đoạn , ví dụ như đối với defaultvòng đời: compile, test, package, install,, vv

  3. 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, warv.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 )

  4. 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:

  1. một pha (ví dụ clean, package)
  2. <plugin-prefix>:<goal>(ví dụ dependency:copy-dependencies)
  3. <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

Chỉ các giai đoạn trong vòng đời mới thực sự có ý nghĩa được coi là "các bước" (của quá trình xây dựng). Tôi muốn gọi nó là 4 thực thể / vật phẩm / thứ .
GeroldBroser phục hồi Monica

Khi tôi nhìn thế giới 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.
Quazi Irfan

26

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, cleansite) và các giai đoạn trong mỗi.

nhập mô tả hình ảnh ở đây

Các pha in đậm - là các pha chính thường được sử dụng.


2
generate-resourcesxuất hiện hai lần và generate-sourcesmất tích.
elingerojo

12

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:

  • Vòng đời vs Pha
  • Plugin vs Mục tiêu

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ẽ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/


2

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


4
Không nhất thiết phải "liên kết với 2 hoặc 3 mục tiêu" . Nó có thể là không , một hoặc nhiều hơn ba , là tốt.
GeroldBroser phục hồi Monica

1

Có ba vòng đời xây dựng tích hợp sau:

  • mặc định
  • dọn dẹp
  • Địa điểm

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 mvntức làmvn -X <your_goal>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.