Maven:ライフサイクルvs.フェーズvs.プラグインvs.目標[終了]


106

ここでは比較的新しい開発者ですが、しばらく使っていましたが、Mavenの基礎を固めたいと思っています。私の問題の一部は、Ant 経験がないことです。これは、多くの説明が出てきたところからのようです。私はチュートリアルを読んでいて、これからも同じ言葉を聞き続けます。

  • ライフサイクル
  • 段階
  • プラグイン
  • ゴール

私が学んだことから、ライフサイクルは最も広い範囲であり、フェーズ、プラグイン、および/または目標で構成されている(または完了している)ようです。

質問:これらの用語がどのように関連しているか、および最も一般的な例に関する情報を提供できますか?

明示的で基本的であるほど良いです!



@Drejcに感謝-検索でこれが見つからなかったなんて信じられない。今から読みます。
Jeff Levine

2
明確にするために するデフォルト、クリーン、およびサイトの3つのタイプがあるlifecycle = lifecycleを構築しますか?その他の説明では、ビルドと呼ばれる4番目のライフサイクルがあると考えました。
Jeff Levine


3
広すぎます?これはMavenの基本的なコアに関係し、いくつかの良い詳細な答えがあります。Mavenタグが1つもないモデレーターは、これを決定できません。
Gerold Broser

回答:


73

A Mavenのライフサイクルをカバーすべてのこと(抽象的)な概念であるステップ:(すべてのMavenの設計者がサポートすることを決め、ステップ以上)は、プロジェクトの開発一生に発生すると予想されています。これらのステップ(またはステージ)は、Maven用語でフェーズと呼ばれます。

A Mavenプラグインは、の/供給用のコンテナです目標。目標に実装されたコードは、実際の主力製品です。(コア自体のMavenは、プラグインを管理し、目標を実行するだけですです)。プラグインの各目標は、任意のライフサイクルフェーズに割り当て/バインドできます。

呼び出すとき mvn <phase> Mavenをすべてのフェーズを通過し(毎回)、すべての目標を実行します指定されたフェーズの前から前まで(およびそれを含む)のいずれかのフェーズバインドされている(プラグインによって提供されます。目標が設定されていないフェーズがある場合、何も行われません。しかし、それでもフェーズは通過します。

つまり、あなたはできません 、Mavenの組み込みライフサイクルの1つに「追加フェーズを挿入」。彼らはいつでもすでにそこにいます!独自のフェーズを使用して独自のライフサイクルを開発することもできますが、それは単にMavenをそのまま使用することをはるかに超えています。

目標は直接実行することもできます。これはmvn、フェーズや目標なしで実行したときに表示されます[ここでは読みやすくするために改行して短縮しています]:

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

参照:

MavenがPOMのゴールバインディングなしで何をすべきかを知っているか疑問に思ったことがあるなら、へのリンクがあります。 default-bindings.xml、最後にあるあります。<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xmlます。

組み込みライフサイクルのフェーズ(cleandefaultsite)は、<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml以下で宣言されています.../<component>/<role>org.apache.maven.lifecycle.Lifecycleます。


41

Maven:ライフサイクルvsフェーズvsプラグインvs目標

このスレッドに欠けているさらに別のレベルの細分性を明確にするために遅く答える:実行 Mavenビルドの最小単位である(目標の)。

したがって、特定のプラグインによって提供される一連の構成された目標を呼び出すことができるフェーズ(低い粒度、サイクルステップ)で構成されるビルドサイクル(基本的に、特定の全体的な目標に対する一連のアクション)があります。つまり、Mavenは(また)プラグイン実行プログラムであり、各プラグインは1つ以上の目標を提供できます。次に、(また)どの目標がどのフェーズに関連付けられるかを決定します。ほとんどの場合、デフォルトのライフサイクル(デフォルトなし)です。しかし、実際にはさらに別のレベルを持つことができます:実行(同じ目標、同じプラグインから、または異なるプラグインからの異なる目標)

全体を再開するために用意した写真 ここに画像の説明を入力してください

そして実際、これは、Mavenがビルドログの一意の文字列を介してそれ(作業の最小単位)を表示する方法です。

plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name

たとえば、次のようになります。

[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project ---

これは実際に(さまざまなレベルの粒度で)意味します。

  • compileフェーズ中(残念ながら言及されていない)>
  • Mavenコンパイラプラグイン(artifactIdおよびversion)を呼び出しています>
  • 私はそのcompile目標を呼び出しています>
  • default-compile実行によって定義される

確かに、異なるフェーズまたは同じフェーズにバインドされた(同じプラグインの)同じ目標を持つことができるが、実行が異なる(つまり、構成が異なる)ため、これはユニークです。maven-compiler-plugin例えば、また、中に使用されるtest-compile位相(それを介してテストコードコンパイルする(異なる相)testCompile(異なる実行において目標を)default-testCompile)。また、POM(および場合によっては異なる構成)で指定した実行によって定義された別のフェーズで自動生成されたコードを(同じプラグインと目標を使用して)コンパイルすることもできます。

デフォルトの実行は、Mavenパッケージバインディングを介してすぐに提供されます。つまり、デフォルトで(および構成に対して規則が適用されます)、Mavenは特定のフェーズで(標準プラグインの)特定の目標をすでに呼び出しています。これらのデフォルトの呼び出しの実行IDは、特定の規則に従って定義されます。

これは、Mavenビルドのデフォルトの動作(バインディング)を本当にオーバーライドしたい場合に、同じプラグインのPOMでまったく同じ実行IDを指定(オーバーライド)する必要がある理由も説明します。たとえば、maven-compiler-plugin同じdefault-compileidであるが存在しないフェーズ(または空のフェーズ)にバインドされたの実行を定義するだけで、コンパイルをスキップできます。

簡潔にするために、実行はMavenにどのフェーズでどの構成でどの目標を実行するかを指示します。

一部の実行はデフォルトで提供されます(デフォルトのバインディング)。これにより、6行のmaven最小pomがすでに多くのことができる理由(コンパイル、テスト、パッケージなど)がわかります。特定のフェーズで標準プラグインの目標を実行する構成。次に、構成を介して、ビルドにスタッフ(実行)を追加したり、すでに構成されているプラ​​グインの動作に影響を与えたりできます(この場合、セクションはありませんが、それだけで十分です)。pom.xmlexecutionsconfiguration

はい、ビルドサイクル(およびそのフェーズ)をスキップして、(プラグインの)目標を直接呼び出すことができます。以下を想像してみてください:

mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar

(注:1回の呼び出しでインラインを呼び出すこともできます)

ここでは、アプリコード、テストコードをコンパイルし、テストとパッケージを実行します。これが手動で、エラーが発生しやすく、反復的で時間がかかる方法を想像してください。構成に関する規約は私たちを助けます:Mavenはビルドのライフサイクルとフェーズを導入します。デフォルトのライフサイクル(名前なし、つまりデフォルト)は、ベストプラクティスと規則(Mavenのマントラ)に基づいてさまざまなフェーズを提供します。
上記と同じようにしたい場合は、次のコマンドを実行するだけmvn packageです。プロジェクトが自動的にコンパイル、テスト、パッケージ化されます。どうやって?プラグインを呼び出します。つまり、フェーズは、意味のある構成可能なプラグイン(目標)実行のセットです。さらに標準にするために、各フェーズでMavenは最初に先行するフェーズを起動します。たとえば、テストしたい場合は、最初にコンパイルすることを確認します。

psは、同じに複数の目標を指定する場合execution、2つの異なる目標(したがって、依然として一意のタプル)の2つの異なる実行(同じIDを持つ)をビルドログにはっきりと表示することに注意してください。


18

Sandeep JindalとPremrajの功績です(ここから、Mavenの目標とフェーズとは何で、それらの違いは何ですか?)。彼らの説明は私が理解するのに役立ちます。

ここでいくつかの完全なコード例と簡単な説明を作成しましたhttps://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。他の人が理解するのに役立ち、直接何かを試すことができると思います。

つまり、リンクから一度に3つすべてを理解しようとするべきではなく、まずこれらのグループの関係を理解する必要があります。

  • ライフサイクルとフェーズ
  • プラグインと目標

1.ライフサイクルとフェーズ

ライフサイクルは、シーケンスのフェーズのコレクションです。ライフサイクルのリファレンスを参照してください。フェーズを呼び出すと、その前のすべてのフェーズも呼び出されます。

たとえば、クリーンライフサイクルには3つのフェーズがあります(pre-clean、clean、post-clean)。

mvn clean

pre-cleancleanを呼び出します。

2.プラグインと目標

目標プラグインのアクションのようなものです。したがって、プラグインがクラスの場合、目標はメソッドです。

あなたはこのような目標を呼び出すことができます:

mvn clean:clean

これは、「クリーンプラグインでクリーンゴールを呼び出す」ことを意味します(ここではクリーンフェーズに関連するものはありません。「クリーン」という言葉で混乱させないでください。同じではありません!上記のリンクにある完全な説明を参照してください)

3.フェーズと目標の関係:

フェーズ目標に(事前に)リンクできます。たとえば、通常、クリーンフェーズはクリーンゴールにリンクします。したがって、このコマンドを呼び出すと:

mvn clean

クリーン前フェーズと、クリーン:クリーン目標にリンクするクリーンフェーズを呼び出します。

それはほとんど同じです:

mvn pre-clean clean:clean

1
@ 2.3. IMHO clean:cleanは、例としては最良の選択ではありません。clean(ライフサイクル、フェーズ、プラグイン、ゴール)という名前の4つのアイテムがあり、特に初心者には混乱する可能性があります(最初は自分用だったと思います)。@ 3.動詞「リンク」も、私見では良い選択ではありません。公式のMaven用語は「バインド」です。
Gerold Broser 2017年

@GeroldBroser。clean:cleanに完全に同意します。私はリンクの完全な説明でそれを説明して警告しました。その警告もここにコピーします。この紛らわしいものの言葉、特に公式のmavenドキュメントを人々に知らせるのは良いことだと私がそれを使用した理由は、それを使用していて、それを明確に説明しています。そして、はい、それも私を混乱させました。とにかく、コメント
ありがとうございました

typo:公式のmavenドキュメントがそれを使用しており、明確に説明していない
Surasin Tancharoen

17

そして遅ればせながら別の図

  • 黄色の長方形としてのライフサイクル
  • 濃い青色の「呼び出し可能」フェーズを含む青い長方形としてのライフサイクルの フェーズ(つまり、ハイペネーションを含むフェーズは、プロジェクトを明確な状態に保つように設計されていない可能性があるため、通常はコマンドラインから呼び出されません)。
  • 青いトローチとしての目標。示されている関連付け/バインディングの「フェーズ->目標」は、「jar」パッケージ化モードの 1つです。すべてのフェーズはそれにバインドされた目標を持つことができます。これはもちろん、各ライフサイクルで当てはまりますが、バインディングは「デフォルト」のライフサイクルでのみ表示されます。
  • 灰色のクリップされた長方形としてのプラグイン。プラグインは、フェーズにバインドできる目標を提供します。

Mavenライフサイクル、フェーズ、目標、プラグイン


graphmlファイル(無料のyEdエディターで編集)は、github.com / dtonhofer / diagrams
David Tonhofer

1)「濃い青になっている「呼び出し可能」フェーズの意味は何ですか?すべての Mavenの段階では、私はむしろそれを呼び出すのに(「呼び出し可能」で呼び出し可能いかなるコードがないことから、呼ばれる直接位相を呼び出すことによって)。または、目標がバインドされたフェーズを「呼び出し可能」と呼びますか(デフォルト)。あなたが見れば、真であるvalidateinitializeverify
Gerold Broser 2018

2)resources:[testR|r]esources目標はライフサイクルのフェーズprocess-sourcesまたはprocess-test-sourcesフェーズにjarバインドされていません。
Gerold Broser 2018

3)modello:javaMODELLOプラグインは、明らかに、ドメイン固有のものです。プラグインの目標をフェーズにバインドすると、どのフェーズでも保持されます。
Gerold Broser

@GeroldBroserコメントに従って修正。「呼び出し可能」とは、コマンドラインから呼び出すことができ、プロジェクトが有効な状態のままであることを期待できることを意味します。意味のある区別はありません呼び出すと、呼び出し呼び出しにはどのようなものですMavenの紹介を使用しています。
David Tonhofer

12

ソースこれは本当に良いチュートリアルです

ライフサイクル、ライフサイクルフェーズ、プラグイン、プラグインの目標は、Mavenの中核です。

  • Mavenコマンド mvn は、ライフサイクルフェーズまたはプラグインの目標のみを引数として受け入れることができます。
  • Mavenには、デフォルト、クリーン、サイトの3つのライフサイクルがあります。
  • 各ライフサイクルはライフサイクルのフェーズで構成されています 28のフェーズがあります。デフォルトは21検証、...、コンパイル、...、パッケージ、...、インストール、デプロイ)、クリーン3事前クリーン、 clean、post-clean)およびsite 4pre-site、site、post-site、site-deploy)。
  • mvnコマンドを使用してライフサイクルフェーズが呼び出されると、先行するすべてのフェーズが順番に実行されます。
  • ライフサイクルフェーズ自体には、一部のタスクを実行する機能がなく、タスクを実行するためにプラグインに依存しています。
  • プロジェクトとパッケージタイプに応じて、Mavenはさまざまなプラグインの目標をライフサイクルフェーズにバインドし、目標はそれらに委託されたタスクを実行します。

走るとき」Javaプロジェクトで mvn package」と、次の図に示すように、Mavenはプラグインの目標をライフサイクルフェーズにバインドします。

mvn-plugins-package-goal


1
あなたが言及した素材はかなり良いです。ありがとうございました!
ウィリアム・キナン

@ " Mavenコマンドmvnは引数としてライフサイクルフェーズまたはプラグインの目標のみを受け入れることができます。 "は正しくありません。オプションも受け入れます
Gerold Broser 2017年

" Javaプロジェクトで" mvn package "を実行すると、Mavenはプラグインの目標をライフサイクルフェーズにバインドします "は正しくありません。ゴールバインディングは実行のかなり前に発生しますmvn ...default-bindings.xmlまたはPOMで、Mavenではなく人間によって行われます。
Gerold Broser 2018

7

ここで概説されているように、もう少し説明します

Mavenビルドは、次のライフサイクルで分割されます。

  • 掃除
  • ビルド(デフォルト)
  • 地点

この各サイクルはフェーズに分割されます。たとえば、ビルドは次のようなフェーズに分割されます。

  • リソースを準備する
  • コンパイル
  • パッケージ
  • インストール

フェーズの前に実行する目標を持ってまたは後に事後例えば、A相:

  • pre-clean-クリーンフェーズの前に実行されます
  • post-clean-クリーンフェーズの後に実行されます

必要に応じて、追加の「挿入」フェーズとして目標を表示できます。詳細については、こちらをお読みになるか、@ Geroldsの回答をご覧ください。


1
この答えは全体として正しくありません。私の答えをください。
Gerold Broser 2015年

あなたがこの質問に答えてから3年後のO少年...そしてそれを手放すことはできません..あなたは勝ちました...
Drejc 2018

勝つことではありません。古い質問、回答、コメントを後で見つけた場合は修正しませんか?
Gerold Broser

3

ライフサイクルとフェーズ:はの Life Cycleコレクションですphases。フェーズを呼び出すと、その前にあるすべてのフェーズも呼び出されます。Mavenには、次の3つのビルドライフサイクルが組み込まれています。

  1. クリーンなライフサイクル-これには、プロジェクトのクリーンアップが含まれます(新しいビルドとデプロイメントのため)
  2. デフォルト/ビルドのライフサイクル-これはプロジェクトの完全なデプロイメントを処理します
  3. サイトのライフサイクル-これは、プロジェクトのJavaドキュメントの生成を処理します。 ここに画像の説明を入力してください

クリーンライフサイクルには、プレクリーン、クリーン、ポストクリーンの3つのフェーズがあります。デフォルトとサイトのライフサイクルのフェーズは、図に示すものと同じです。


最後の段落は誤解を招くものです。特に最初と最後の文。目標フェーズはまったく異なります。それらのいくつかは同じ名前を持っているので、それらを混同しないでください。Re " 目標は、上の画像に表示されているフェーズです。 ":画像に示されている単一の目標はありません。これらはすべてフェーズです。「再あなたが特定の目標を実行する必要がするときは、 『目標』としてフェーズ名を記述します。」:それはプラグインのゴールを実行することは可能ですが明示的に通常の方法では、特定のビルドを実行することであるmvn <phase>。ここで私の答えを参照してください。
Gerold Broser

おかげで、「プラグイン対ゴール」の部分を削除しました。すぐに更新します。
アルンラージ2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.