Maven: Vòng đời so với Giai đoạn so với Plugin so với Mục tiêu [đã đóng]


106

Nhà phát triển tương đối mới ở đây, mặc dù tôi đã sử dụng nó một thời gian, tôi hy vọng sẽ củng cố các nguyên tắc cơ bản về Maven của mình. Một phần vấn đề của tôi là tôi không có kinh nghiệm về Ant, điều này dường như là do nhiều lời giải thích bắt nguồn từ đó. Tôi đã đọc và xem các hướng dẫn, và tôi vẫn nghe thấy các thuật ngữ tương tự:

  • Vòng đời
  • Giai đoạn
  • Cắm vào
  • Mục tiêu

Từ những gì tôi đã học được, có vẻ như vòng đời là vòng đời rộng nhất và bao gồm (hoặc hoàn thành bởi) các giai đoạn, bổ sung và / hoặc mục tiêu.

Câu hỏi : Bạn có thể cung cấp bất kỳ thông tin nào về cách các thuật ngữ này liên quan và các ví dụ phổ biến nhất không?

Càng rõ ràng và cơ bản, càng tốt!



Cảm ơn @Drejc - không thể tin được là tôi không tìm thấy cái này trong tìm kiếm của mình. Tôi sẽ đọc qua nó ngay bây giờ.
Jeff Levine

2
Vì vậy, để làm rõ, xây dựng lifeecycle = vòng đời , trong đó có ba loại: mặc định, sạch và trang web? Những giải thích khác khiến tôi nghĩ rằng có một vòng đời thứ tư được gọi là xây dựng .
Jeff Levine


3
Quá rộng? Điều này liên quan đến những điều cơ bản cốt lõi của Maven và có một vài câu trả lời hay và chi tiết. Người kiểm duyệt không có một thẻ maven không được phép quyết định điều này.
Gerold Broser

Câu trả lời:


73

Một Maven vòng đời là một (trừu tượng) khái niệm bao gồm tất cả các bước (hoặc tốt hơn: tất cả các bước của Maven nhà thiết kế đã quyết định hỗ trợ) được dự kiến sẽ xảy ra trong cuộc đời của phát triển của dự án. Các bước (hoặc các giai đoạn) này được gọi là các giai đoạn trong thuật ngữ Maven.

Một plugin Maven là một vùng chứa / nhà cung cấp các mục tiêu. Mã được thực hiện trong các mục tiêu là quy trình làm việc thực sự. (Bản thân Maven trong cốt lõi của nó chỉ là quản lý các plugin và thực hiện các mục tiêu ). Mỗi mục tiêu của plugin có thể được gán / ràng buộc cho bất kỳ giai đoạn nào của vòng đời.

Khi gọi mvn <phase> Maven vượt qua tất cả các giai đoạn (mọi lúc) và thực hiện tất cả các mục tiêu (được cung cấp bởi các plugin) đã được ràng buộc với bất kỳ giai đoạn nào trước đó và cho đến (và bao gồm) giai đoạn đã cho. Nếu có một giai đoạn không có mục tiêu ràng buộc với nó thì không có gì được thực hiện. Tuy nhiên, giai đoạn này đã trôi qua.

Tức là bạn không thể "" chèn "các pha bổ sung" vào một trong các vòng đời có sẵn của Maven. Họ đã ở đó, luôn luôn! Bạn có thể phát triển vòng đời của riêng mình với các giai đoạn của riêng nó nhưng điều đó không chỉ đơn giản là sử dụng Maven.

Các mục tiêu cũng có thể được thực hiện trực tiếp, bạn sẽ được thông báo khi chạy mvnmà không có bất kỳ pha hoặc mục tiêu nào [có ngắt dòng và rút gọn để dễ đọc tại đây]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Người giới thiệu:

Nếu bạn từng tự hỏi làm thế nào Maven biết phải làm gì mà không có bất kỳ ràng buộc mục tiêu nào trong POM, có một liên kết đến default-bindings.xmlở cuối <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Các giai đoạn cho các vòng đời tích hợp ( sạch , mặc định , trang web ) được khai báo trong <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlbên dưới .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.


41

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ộ nhập mô tả hình ảnh ở đây

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 compilegiai đoạn (không được đề cập, rất tiếc)>
  • Tôi đang gọi plugin Maven Compiler ( artifactIdversion)>
  • Tôi đang gọi compilemục tiêu của nó >
  • như được định nghĩa bởi sự default-compilethự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-pluginví dụ, cũng được sử dụng trong test-compilegiai đoạn (giai đoạn khác nhau) để mã kiểm tra biên dịch (thông qua nó testCompilekhung 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-plugincùng một default-compileid 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.xmlcấ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ó executionsphần, nhưng chỉ cần configurationlà đủ).

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 packagevà 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).


18

Tín dụng cho Sandeep Jindal và Premraj (từ đây Mục tiêu và các giai đoạn của Maven là gì và sự khác biệt của chúng là gì? ). Lời giải thích của họ giúp tôi hiểu.

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-cycle-phase-and-goal-easy-explained/ . Tôi nghĩ nó có thể giúp người khác hiểu và có thể thử trực tiếp điều gì đó.

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 so với giai đoạn
  • Plugin so với Mục tiêu

1. Vòng đời so với Giai đoạn

Vòng đời là tập hợp các giai đoạn theo trình tự, xem tại đây 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ó.

Ví dụ, vòng đời sạch có 3 giai đoạn ( sạch trước, sạch, sau sạch ).

mvn clean

Nó sẽ gọi là pre-cleanclean .

2. Plugin so với 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, thì mục tiêu là một phương thức.

bạn có thể gọi một mục tiêu như sau:

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 nhầm lẫn, chúng không giống nhau! Xem giải thích đầy đủ trong liên kết của tôi ở trên)

3. Bây giờ là mối quan hệ giữa Giai đoạn và Mục tiêu:

Pha bóng có thể (trước) liên kết với (các) Bàn thắng . Ví dụ, thông thường, pha bóng liên kết với khung thành sạch. Vì vậy, khi bạn gọi lệnh này:

mvn clean

Nó sẽ được gọi là giai đoạn trước sạch sẽ và giai đoạn 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

1
@ 2. & 3. IMHO, clean:cleankhông phải là lựa chọn tốt nhất cho một ví dụ. Có 4 mục được đặt tên clean(vòng đời, giai đoạn, plugin, mục tiêu) có thể gây nhầm lẫn, đặc biệt là đối với người mới bắt đầu (tôi nhớ rằng nó đã dành cho tôi lúc đầu). @ 3. Động từ "liên kết" cũng không phải là một lựa chọn tốt, IMHO. Thuật ngữ Maven chính thức là " ràng buộc ".
Gerold Broser

@GeroldBroser. Hoàn toàn đồng ý với clean: sạch sẽ. Tôi đã giải thích và cảnh báo điều đó trong phần giải thích đầy đủ của tôi trong liên kết. Tôi cũng sẽ sao chép cảnh báo đó vào đây. Lý do mà tôi sử dụng nó vì rất tốt khi cho mọi người biết về từ khó hiểu này và đặc biệt, tài liệu maven chính thức đang sử dụng nó và giải thích rõ ràng về nó. Và vâng, nó cũng khiến tôi bối rối. Dù sao, cảm ơn rất nhiều cho ý kiến
Surasin Tancharoen

typo: tài liệu maven chính thức là sử dụng nó và không giải thích rõ ràng
Surasin Tancharoen

17

Và muộn màng một sơ đồ khác

  • Vòng đời dưới dạng hình chữ nhật màu vàng
  • Các giai đoạn của vòng đời dưới dạng hình chữ nhật màu xanh lam với các giai đoạn "có thể gọi" có màu xanh lam đậm hơn (nghĩa là các giai đoạn có dấu hiệu cường điệu thường không được gọi từ dòng lệnh vì chúng có thể không được thiết kế để rời khỏi dự án ở trạng thái xác định rõ).
  • Mục tiêu như viên ngậm xanh. Giai đoạn liên kết / ràng buộc "-> mục tiêu" được hiển thị là một trong những chế độ đóng gói "bình" . Mỗi giai đoạn đều có thể có mục tiêu gắn liền với nó. Tất nhiên, điều này được áp dụng cho mỗi vòng đời, mặc dù các ràng buộc chỉ hiển thị cho vòng đời "mặc định".
  • Các plugin dưới dạng hình chữ nhật cắt bớt màu xám. Các plugin cung cấp các Mục tiêu có thể được liên kết với các Giai đoạn.

Maven Vòng đời, Giai đoạn, Mục tiêu, Plugin


Các tập tin graphml (sửa với trình chỉnh Yed miễn phí) có sẵn tại github.com/dtonhofer/diagrams
David Tonhofer

1) Ý bạn chính xác là gì khi nói "pha " có thể gọi được "" có màu xanh lam đậm hơn "? Mọi pha Maven đều "có thể gọi được" (mặc dù tôi muốn gọi nó là bất khả xâm phạm , vì không có mã nào được gọi trực tiếp bằng cách gọi một pha). Hay bạn gọi các pha là "có thể gọi được " có mục tiêu bị ràng buộc với nó (theo mặc định)? Thậm chí điều đó không đúng, nếu bạn nhìn vào validate, initializeverify.
Gerold Broser

2) resources:[testR|r]esourcesMục tiêu KHÔNG bị ràng buộc với process-sourceshoặc process-test-sourcescác giai đoạn trong jarvòng đời .
Gerold Broser

3) modello:javacủa Plugin Modello rõ ràng là dành riêng cho miền. Việc ràng buộc mục tiêu của plugin với một giai đoạn được giữ cho bất kỳ giai đoạn nào.
Gerold Broser

@GeroldBroser Đã sửa theo nhận xét. "Callable" có nghĩa là người ta có thể gọi nó từ dòng lệnh và mong đợi dự án vẫn ở trạng thái hợp lệ. Không có sự phân biệt có ý nghĩa giữa gọigọigọi là những gì Phần giới thiệu Maven sử dụng.
David Tonhofer

12

Nguồn đây là hướng dẫn thực sự tốt

Vòng đời, Giai đoạn vòng đời, Plugin và Mục tiêu plugin là cốt lõi của Maven.

  • Lệnh Maven mvn chỉ có thể chấp nhận Giai đoạn Vòng đời hoặc Mục tiêu Trình cắm làm đối số.
  • Maven đi kèm với ba vòng đời - mặc định, sạch và trang web.
  • Mỗi vòng đời được tạo thành từ các giai đoạn vòng đời và tất cả, có 28 giai đoạn - mặc định 21 ( xác thực, ..., biên dịch, ..., gói, ..., cài đặt, triển khai ), sạch 3 ( dọn dẹp trước, sạch, sau sạch ) và trang 4 ( trước trang, trang, sau trang, triển khai trang ).
  • khi một giai đoạn vòng đời được gọi bằng lệnh mvn, tất cả các giai đoạn trước đó được thực hiện tuần tự lần lượt.
  • Bản thân các giai đoạn vòng đời không có bất kỳ khả năng nào để hoàn thành một số nhiệm vụ và chúng dựa vào các plugin để thực hiện nhiệm vụ.
  • tùy thuộc vào dự án và loại đóng gói, Maven liên kết các mục tiêu plugin khác nhau với các giai đoạn vòng đời và các mục tiêu thực hiện nhiệm vụ được giao phó.

Khi chúng tôi chạy " gói mvn " trong một Dự án Java, Maven liên kết các mục tiêu của plugin với các giai đoạn vòng đời như thể hiện trong hình tiếp theo.

mvn-plugins-gói-mục tiêu


1
Tài liệu bạn đã đề cập là khá tốt. Cảm ơn bạn!
William Kinaan

@ " Lệnh Maven mvn chỉ có thể chấp nhận Đối số Giai đoạn Vòng đời hoặc Mục tiêu Trình cắm. " Là không đúng. Nó cũng chấp nhận các tùy chọn .
Gerold Broser

" Khi chúng tôi chạy" gói mvn "trong một Dự án Java, Maven liên kết các mục tiêu của plugin với các giai đoạn vòng đời " là không đúng. Liên kết mục tiêu xảy ra rất lâu trước khi chạy mvn ...: Trong default-bindings.xml hoặc trong POM và nó không được thực hiện bởi Maven mà bởi con người.
Gerold Broser

7

Vì vậy, để giải thích thêm một chút như đã nêu ở đây

Các bản dựng Maven được chia theo các vòng đời như sau:

  • dọn dẹp
  • xây dựng (mặc định)
  • Địa điểm

Mỗi chu kỳ này được chia thành các giai đoạn. Ví dụ: xây dựng được chia thành các giai đoạn như:

  • chuẩn bị nguồn lực
  • biên dịch
  • gói hàng
  • Tải về

Giai đoạn có những mục tiêu để chạy trước trước hoặc sau hậu giai đoạn, ví dụ:

  • pre-clean - sẽ được thực hiện trước giai đoạn clean
  • post-clean - sẽ được thực thi sau giai đoạn clean

Bạn có thể xem các mục tiêu dưới dạng các pha "chèn" bổ sung nếu bạn muốn. Đọc ở đây hoặc xem câu trả lời của @Gerolds để biết chi tiết.


1
Câu trả lời này không chính xác toàn bộ. Hãy xem câu trả lời của tôi .
Gerold Broser

Hỡi chàng trai đã 3 năm kể từ khi bạn trả lời câu hỏi này ... và vẫn không để nó trôi qua .. bạn đã thắng ... bây giờ hãy bước tiếp.
Drejc

Đó không phải là chiến thắng. Bạn không sửa lại các câu hỏi, câu trả lời và nhận xét cũ nếu bạn tình cờ gặp lại chúng sau này?
Gerold Broser

3

LifeCycle vs Phases: Life Cycle là một tập hợp của phases. Khi bạn gọi một pha, nó cũng sẽ gọi tất cả các pha đến trước nó. Maven đi kèm với 3 vòng đời xây dựng được tích hợp sẵn như:

  1. Vòng đời sạch - điều này liên quan đến việc làm sạch dự án (để xây dựng và triển khai mới)
  2. Vòng đời mặc định / xây dựng- điều này xử lý việc triển khai hoàn chỉnh của dự án
  3. Vòng đời của trang web- điều này xử lý việc tạo tài liệu java của dự án. nhập mô tả hình ảnh ở đây

Vòng đời sạch có 3 giai đoạn: sạch trước, sạch và sau sạch. Các giai đoạn của vòng đời mặc định và trang web giống như trong hình.


Đoạn cuối cùng của bạn là sai lệch. Đặc biệt là câu đầu và câu cuối. Bàn thắngcác pha là những thứ hoàn toàn khác nhau. Bạn không được nhầm lẫn chúng vì một số chúng có tên giống hệt nhau. Re " Bàn thắng là những pha bạn thấy trong hình trên. ": Không có một mục tiêu nào được đề cập trong hình. Đây là tất cả các giai đoạn . Re " Bạn viết tên giai đoạn như 'mục tiêu' khi bạn phải thực hiện mục tiêu nhất định. ": Mặc dù có thể chạy mục tiêu một plugin của explicitely theo cách thông thường là để thực hiện một xây dựng lên đến một số giai đoạn với mvn <phase>. Xem câu trả lời của tôi ở đây.
Gerold Broser

Cảm ơn, tôi đã xóa phần "Plugin vs Goal". Tôi sẽ cập nhật nó sớm.
Arun Raaj
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.