Mavenの目標とフェーズとは何ですか?それらの違いは何ですか?


回答:


251

ゴールはフェーズで実行され、ゴールが実行される順序を決定するのに役立ちます。これを最もよく理解するには、デフォルトでどのフェーズでゴールが実行されるかを示すデフォルトのMavenライフサイクルバインディングを確認します。コンパイルフェーズの目標は常にテストフェーズの目標の前に実行され、テストフェーズの目標は常にパッケージフェーズの目標の前に実行されます。

混乱の一部は、mavenを実行するときに目標またはフェーズを指定できるという事実によって悪化します。フェーズを指定した場合、mavenは指定したフェーズまでのすべてのフェーズを順番に実行します(たとえば、パッケージを指定した場合、最初にコンパイルフェーズ、次にテストフェーズ、最後にパッケージフェーズが実行されます)。そのフェーズに関連付けられているすべての目標を実行します。

Mavenビルドファイルでプラグインの実行を作成し、目標のみを指定すると、その目標が既定のフェーズにバインドされます。たとえば、jaxb:xjcゴールはデフォルトでgenerate-resourcesフェーズにバインドします。ただし、実行を指定するときは、その目標のフェーズを明示的に指定することもできます。

Mavenの実行時に目標を指定すると、その目標が実行され、その目標のみが実行されます。言い換えると、jar:jarゴールを指定すると、jar:jarゴールのみが実行され、コードがjarにパッケージ化されます。以前にコンパイル目標を実行したことがないか、コンパイル済みコードを他の方法で準備していない場合、これはおそらく失敗する可能性があります。


11
「実行」「実行」(後者はMavenの「ビルドライフサイクル概要」で呼ばれているため)の代わりに、「Maven すべてのフェーズ(指定されたものを含む)に合格」と言うのが習慣になりました。このように区別することは、実際に実行される目標のコードからより明確になります。しかし、それは個人的な好みかもしれません。
GeroldBroserがモニカを

しかし、どのフェーズにも属さない目標を実行することもできます。つまりmvn archetype:generate、その場合、Mavenは目標のみを実行しますか?
Quazi Irfan 2017

1
@Pace最後の段落の参照がありますか?私はそれを疑っていて、ここで単純なプロジェクトで試してみました:mvn test実行: --- 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:testmvn compiler:testCompile実行中--- maven-compiler-plugin:3.1:testCompile ...
GeroldBroserがモニカを2018

4
@Pace mvn clean compiler:testCompileが実行さ--- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileれ、失敗します 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 MvnPhaseMvnPhaseテスト対象のクラスは、テストクラスで参照されています)。ゴールが明示的に呼び出された場合、フェーズは呼び出されないようです。
GeroldBroserがモニカを2018

1
geroldbroserと@ kekko12からの入力に基づいて、最後の段落を更新し、目標が指定された場合、その目標のみが実行され、先行するすべてのフェーズは実行されないことを示しました。
ペース

188

ライフサイクルは、名前付きフェーズのシーケンスです。
フェーズは順次実行されます。フェーズの実行とは、以前のすべてのフェーズを実行することを意味します。

プラグインは、MOJO(M aven O ld J ava O bject)とも呼ばれる目標のコレクションです。 類推:プラグインはクラスであり、目標はクラス内のメソッドです。

Mavenは、Build Life Cyclesの中心的な概念に基づいています。各ビルドライフサイクル内にはビルドフェーズがあり、各ビルドフェーズ内にはビルド目標があります。

ビルドフェーズまたはビルドゴールを実行できます。ビルドフェーズを実行するとき、そのビルドフェーズ内のすべてのビルド目標を実行します。ビルド目標は、1つ以上のビルドフェーズに割り当てられます。ビルドゴールを直接実行することもできます。

3つの主要な組み込みビルドライフサイクルがあります。

  1. デフォルト
  2. 掃除
  3. 地点

各ビルドライフサイクルはフェーズで構成されています

たとえば、defaultライフサイクルは次のビルドフェーズで構成されます。

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

したがって、上記のフェーズを実行するには、1つのコマンドを呼び出す必要があります。

mvn <phase> { Ex: mvn install }

上記のコマンドでは、最初のフェーズから開始して、すべてのフェーズが「インストール」フェーズまで順次実行されます。mvn次のように、目標またはフェーズ(または複数の目標または複数のフェーズ)を実行できます。

mvn clean install plugin:goal  

ただし、プラグインの参照に使用するプレフィックスをカスタマイズする場合maven-plugin-pluginは、プラグインのPOMのの構成パラメーターを介してプレフィックスを直接指定できます

ビルドフェーズはプラグインの目標で構成されています

Mavenの機能のほとんどはプラグインにあります。プラグインは、次の構文を使用して実行できる一連の目標を提供します。

 mvn [plugin-name]:[goal-name]

たとえば、Javaプロジェクトは、を実行することにより、compiler-pluginのcompile-goalでコンパイルできますmvn compiler:compile

ビルドライフサイクルは、目標の実行に順序を付けるために使用できる名前付きフェーズのリストです。

プラグインによって提供される目標は、ライフサイクルのさまざまなフェーズに関連付けることができます。たとえば、デフォルトでは、目標が compiler:compile関連付けられているcompile 段階ながら、目標が surefire:test関連付けられているtest 段階。次のコマンドを検討してください。

mvn test

上記のコマンドが実行されると、Mavenはフェーズまでの各フェーズに関連付けられたすべての目標を実行しtestます。このような場合、Maven resources:resourcesprocess-resourcesフェーズに関連付けられた目標を実行し、その後compiler:compile、最終的にsurefire:test目標を実行するまで続けます。

ただし、ビルドフェーズがビルドライフサイクルの特定のステップを担当する場合でも、それらの責任を実行する方法は異なる場合があります。そして、これは、それらのビルドフェーズにバインドされたプラグインの目標を宣言することによって行われます。

プラグインの目標は、プロジェクトのビルドと管理に貢献する特定のタスク(ビルドフェーズよりも細かい)を表します。ゼロ以上のビルドフェーズにバインドされている可能性があります。ビルドフェーズにバインドされていない目標は、直接呼び出しによってビルドライフサイクルの外で実行できます。実行の順序は、ゴールとビルドフェーズが呼び出される順序によって異なります。たとえば、次のコマンドを考えます。しながら、引数は、ビルドフェーズです(プラグインの)目標です。cleanpackagedependency:copy-dependencies

mvn clean dependency:copy-dependencies package

これを実行する場合、cleanフェーズが最初に実行され(クリーンライフサイクルの先行するすべてのフェーズとcleanフェーズ自体が実行されます)、次にdependency:copy-dependencies目標が実行されてから、packageフェーズ(およびその先行するすべてのビルドフェーズが実行されます)デフォルトのライフサイクル)。

さらに、目標が1つ以上のビルドフェーズにバインドされている場合、その目標はすべてのフェーズで呼び出されます。

さらに、ビルドフェーズには0個以上の目標を設定することもできます。ビルドフェーズにバインドされた目標がない場合、そのビルドフェーズは実行されません。ただし、1つ以上の目標がバインドされている場合は、それらの目標をすべて実行します。

組み込みのライフサイクルバインディング
一部のフェーズには、デフォルトで目標がバインドされています。また、デフォルトのライフサイクルでは、これらのバインディングはパッケージの値に依存します。

Mavenアーキテクチャ:

ここに画像の説明を入力してください

リファレンス1
リファレンス2

MavenライフサイクルマッピングのEclipseサンプル

MavenライフサイクルマッピングのEclipseサンプル


2つのプロファイルがある場合、最初にプロファイル1のすべてのプラグインを実行してから、プロファイル2のプラグインを実行できますか?
Bee

[plugin-name]この例でmvn [plugin-name]:[goal-name]はむしろプラグインの接頭辞です。mvn clean installマルチモジュールシナリオで使用することができるだけではありません。マルチモジュールは完全に異なるトピックです。
GeroldBroserがモニカを2018

同じフェーズに関連付けられた目標は、任意の順序に従いますか?
eel ghEEz 2018年

5
このテキストのほとんどは、Mavenのドキュメントからそのままコピーされます。これは明確に述べられるべきです!
Lii

素晴らしいソース!
Bobo

45

選ばれた答えは素晴らしいですが、それでもトピックに小さな何かを追加したいと思います。イラスト。

さまざまなフェーズがさまざまなプラグインにどのようにバインドされているか、およびそれらのプラグインが公開する目標を明確に示しています。

それで、次のようなものを実行する場合を調べてみましょうmvn compile

  • コンパイル目標でコンパイラプラグインを実行するフェーズです
  • コンパイラプラグインは別の目標を得ました。以下のためmvn compileには、特定の目標、コンパイル目標にマッピングされています。
  • 走るのと同じ mvn compiler:compile

したがって、フェーズはプラグインの目標で構成されます

ここに画像の説明を入力してください

リファレンスへのリンク


20
なぜをmvn test指してpackage、をmvn install指していdeployますか?
Abdull

2
気づいてくれてありがとう(ウェブで見つけた)イラストのエラーのようです。
ジョニー

3
イラストはどこから手に入れたのですか?著作権と利用規約を確認しましたか?
Abdull

1
ここから取得した@Abdull画像carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/…(それは他の多くのWebページにも表示されます)回答に追加します。この点を指摘してくれてありがとう、それの重要性を知らなかった。
ジョニー

1
図のフェーズからプラグインへのポインターも正しくありません。jarプラグインは実際にはpackageフェーズで実行されます。そして、フェーズとプラグインのサンドイッチのpomは少し混乱します(pomでは、デフォルトのバインディングに加えて、どのプラグインがどのフェーズで実行されるかを構成できることを意味するはずです)。ただし、一般原則は正しいです。
Alexander Klimetschek

43

定義はMavenサイトのページ「ビルドライフサイクルの概要で詳しく説明されていますが、要約してみました。

Mavenは、ビルドプロセスの4つの項目を定義します。

  1. ライフサイクル

    三つは、内蔵のライフサイクル(別名ビルドライフサイクル): 、default、。clean siteライフサイクルリファレンス

  2. 段階

    それぞれのライフサイクルは、から構成されている段階のために例えば、defaultライフサイクル:compiletestpackageinstall、など

  3. プラグイン

    1つ以上の目標を提供するアーティファクト。

    パッケージタイプ(jarwarなど)に基づいて、プラグインの目標はデフォルトでフェーズにバインドされます。(組み込みライフサイクルバインディング

  4. ゴール

    実行されるタスク(アクション)。プラグインは1つ以上の目標を持つことができます。

    POMでプラグインを設定する場合、1つ以上の目標を指定する必要があります。さらに、プラグインにデフォルトのフェーズが定義されていない場合、指定された目標をフェーズにバインドできます。

Mavenは以下で呼び出すことができます:

  1. 相(例えばcleanpackage
  2. <plugin-prefix>:<goal>(例dependency:copy-dependencies
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(例org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile

いずれかまたはすべての1つ以上の組み合わせ、たとえば:

mvn clean dependency:copy-dependencies package

ライフサイクルフェーズのみが (ビルドプロセスの)"ステップ"と見なすのが本当に理にかなっています。私はむしろそれを4エンティティ/アイテム/ものと呼びたいです。
GeroldBroserがモニカを

私は世界を見るときBuild Phase、それをライフサイクルの別のフェーズと考え、混乱させます。
Quazi Irfan 2017

26

私は良い答えがすでに提供されて信じていますが、私は別の3ライフサイクル(のわかりやすい図を追加したいbuildcleansiteそれぞれに)と位相を。

ここに画像の説明を入力してください

太字のフェーズ-一般的に使用される主なフェーズです。


2
generate-resourcesが2回表示され、generate-sources欠落しています。
elingerojo

12

Sandeep JindalとPremrajの功績です。彼らの説明は、私がしばらくこれについて混乱した後で理解するのに役立ちます。

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

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

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

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

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

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

mvn clean

pre-cleanおよびcleanと呼ばれます。

2.プラグインと目標

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

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

mvn clean:clean

これは、「クリーンプラグインでクリーンゴールを呼び出す」ことを意味します(ここではクリーンフェーズには何も関係ありません。「クリーン」という言葉で混乱させないでください。同じではありません!)

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

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

mvn clean

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

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

mvn pre-clean clean:clean

詳細と完全な例はhttps://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/にあります


2

フェーズと目標を持つMaven作業用語。

フェーズ:Mavenフェーズは、2つまたは3つの目標に関連付けられたアクションのセットです

exmaple:-mvn cleanを実行した場合

これはフェーズmvn clean:cleanを実行するフェーズです

目標:フェーズに限定されたMavenゴール

参考のために http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html


4
必ずしも「2つまたは3つの目標に関連付けられている」必要はありません。なし1つ、または3つ以上にすることできます。
GeroldBroserがモニカを

1

次の3つの組み込みビルドライフサイクルがあります。

  • デフォルト
  • 掃除
  • 地点

ライフサイクルのデフォルト -> [検証、初期化、生成ソース、プロセスソース、生成リソース、プロセスリソース、コンパイル、プロセスクラス、生成テストソース、プロセステストソース、生成テストリソース、プロセス-test-resources、test-compile、process-test-classes、test、prepare-package、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy]

ライフサイクルクリーン -> [プレクリーン、クリーン、ポストクリーン]

ライフサイクルサイト -> [プレサイト、サイト、ポストサイト、サイト展開]

たとえば、フローはシーケンシャルであり、デフォルトのライフサイクルでは、検証から始まり、次に初期化されます。

mvnieのデバッグモードを有効にすると、ライフサイクルを確認できます。mvn -X <your_goal>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.