回答:
ゴールはフェーズで実行され、ゴールが実行される順序を決定するのに役立ちます。これを最もよく理解するには、デフォルトでどのフェーズでゴールが実行されるかを示すデフォルトのMavenライフサイクルバインディングを確認します。コンパイルフェーズの目標は常にテストフェーズの目標の前に実行され、テストフェーズの目標は常にパッケージフェーズの目標の前に実行されます。
混乱の一部は、mavenを実行するときに目標またはフェーズを指定できるという事実によって悪化します。フェーズを指定した場合、mavenは指定したフェーズまでのすべてのフェーズを順番に実行します(たとえば、パッケージを指定した場合、最初にコンパイルフェーズ、次にテストフェーズ、最後にパッケージフェーズが実行されます)。そのフェーズに関連付けられているすべての目標を実行します。
Mavenビルドファイルでプラグインの実行を作成し、目標のみを指定すると、その目標が既定のフェーズにバインドされます。たとえば、jaxb:xjcゴールはデフォルトでgenerate-resourcesフェーズにバインドします。ただし、実行を指定するときは、その目標のフェーズを明示的に指定することもできます。
Mavenの実行時に目標を指定すると、その目標が実行され、その目標のみが実行されます。言い換えると、jar:jarゴールを指定すると、jar:jarゴールのみが実行され、コードがjarにパッケージ化されます。以前にコンパイル目標を実行したことがないか、コンパイル済みコードを他の方法で準備していない場合、これはおそらく失敗する可能性があります。
mvn archetype:generate
、その場合、Mavenは目標のみを実行しますか?
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:test
、mvn compiler:testCompile
実行中--- maven-compiler-plugin:3.1:testCompile ...
。
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 MvnPhase
(MvnPhase
テスト対象のクラスは、テストクラスで参照されています)。ゴールが明示的に呼び出された場合、フェーズは呼び出されないようです。
ライフサイクルは、名前付きフェーズのシーケンスです。
フェーズは順次実行されます。フェーズの実行とは、以前のすべてのフェーズを実行することを意味します。プラグインは、MOJO(M aven O ld J ava O bject)とも呼ばれる目標のコレクションです。 類推:プラグインはクラスであり、目標はクラス内のメソッドです。
Mavenは、Build Life Cyclesの中心的な概念に基づいています。各ビルドライフサイクル内にはビルドフェーズがあり、各ビルドフェーズ内にはビルド目標があります。
ビルドフェーズまたはビルドゴールを実行できます。ビルドフェーズを実行するとき、そのビルドフェーズ内のすべてのビルド目標を実行します。ビルド目標は、1つ以上のビルドフェーズに割り当てられます。ビルドゴールを直接実行することもできます。
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:resources
はprocess-resources
フェーズに関連付けられた目標を実行し、その後compiler:compile
、最終的にsurefire:test
目標を実行するまで続けます。
ただし、ビルドフェーズがビルドライフサイクルの特定のステップを担当する場合でも、それらの責任を実行する方法は異なる場合があります。そして、これは、それらのビルドフェーズにバインドされたプラグインの目標を宣言することによって行われます。
プラグインの目標は、プロジェクトのビルドと管理に貢献する特定のタスク(ビルドフェーズよりも細かい)を表します。ゼロ以上のビルドフェーズにバインドされている可能性があります。ビルドフェーズにバインドされていない目標は、直接呼び出しによってビルドライフサイクルの外で実行できます。実行の順序は、ゴールとビルドフェーズが呼び出される順序によって異なります。たとえば、次のコマンドを考えます。しながら、引数は、ビルドフェーズです(プラグインの)目標です。clean
package
dependency:copy-dependencies
mvn clean dependency:copy-dependencies package
これを実行する場合、clean
フェーズが最初に実行され(クリーンライフサイクルの先行するすべてのフェーズとclean
フェーズ自体が実行されます)、次にdependency:copy-dependencies
目標が実行されてから、package
フェーズ(およびその先行するすべてのビルドフェーズが実行されます)デフォルトのライフサイクル)。
さらに、目標が1つ以上のビルドフェーズにバインドされている場合、その目標はすべてのフェーズで呼び出されます。
さらに、ビルドフェーズには0個以上の目標を設定することもできます。ビルドフェーズにバインドされた目標がない場合、そのビルドフェーズは実行されません。ただし、1つ以上の目標がバインドされている場合は、それらの目標をすべて実行します。
組み込みのライフサイクルバインディング
一部のフェーズには、デフォルトで目標がバインドされています。また、デフォルトのライフサイクルでは、これらのバインディングはパッケージの値に依存します。
Mavenアーキテクチャ:
MavenライフサイクルマッピングのEclipseサンプル
[plugin-name]
この例でmvn [plugin-name]:[goal-name]
はむしろプラグインの接頭辞です。mvn clean install
「マルチモジュールシナリオで使用する」ことができるだけではありません。マルチモジュールは完全に異なるトピックです。
選ばれた答えは素晴らしいですが、それでもトピックに小さな何かを追加したいと思います。イラスト。
さまざまなフェーズがさまざまなプラグインにどのようにバインドされているか、およびそれらのプラグインが公開する目標を明確に示しています。
それで、次のようなものを実行する場合を調べてみましょうmvn compile
:
mvn compile
には、特定の目標、コンパイル目標にマッピングされています。mvn compiler:compile
したがって、フェーズはプラグインの目標で構成されます。
リファレンスへのリンク
mvn test
指してpackage
、をmvn install
指していdeploy
ますか?
jar
プラグインは実際にはpackage
フェーズで実行されます。そして、フェーズとプラグインのサンドイッチのpomは少し混乱します(pomでは、デフォルトのバインディングに加えて、どのプラグインがどのフェーズで実行されるかを構成できることを意味するはずです)。ただし、一般原則は正しいです。
定義はMavenサイトのページ「ビルドライフサイクルの概要」で詳しく説明されていますが、要約してみました。
Mavenは、ビルドプロセスの4つの項目を定義します。
ライフサイクル
三つは、内蔵のライフサイクル(別名ビルドライフサイクル): 、default
、。clean
site
(ライフサイクルリファレンス)
段階
それぞれのライフサイクルは、から構成されている段階のために例えば、default
ライフサイクル:compile
、test
、package
、install
、など
プラグイン
1つ以上の目標を提供するアーティファクト。
パッケージタイプ(jar
、war
など)に基づいて、プラグインの目標はデフォルトでフェーズにバインドされます。(組み込みライフサイクルバインディング)
ゴール
実行されるタスク(アクション)。プラグインは1つ以上の目標を持つことができます。
POMでプラグインを設定する場合、1つ以上の目標を指定する必要があります。さらに、プラグインにデフォルトのフェーズが定義されていない場合、指定された目標をフェーズにバインドできます。
Mavenは以下で呼び出すことができます:
clean
、package
)<plugin-prefix>:<goal>
(例dependency:copy-dependencies
)<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
Build Phase
、それをライフサイクルの別のフェーズと考え、混乱させます。
私は良い答えがすでに提供されて信じていますが、私は別の3ライフサイクル(のわかりやすい図を追加したいbuild
、clean
とsite
それぞれに)と位相を。
太字のフェーズ-一般的に使用される主なフェーズです。
generate-resources
が2回表示され、generate-sources
欠落しています。
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/にあります
フェーズと目標を持つMaven作業用語。
フェーズ:Mavenフェーズは、2つまたは3つの目標に関連付けられたアクションのセットです
exmaple:-mvn cleanを実行した場合
これはフェーズmvn clean:cleanを実行するフェーズです
目標:フェーズに限定されたMavenゴール
参考のために http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
次の3つの組み込みビルドライフサイクルがあります。
ライフサイクルのデフォルト -> [検証、初期化、生成ソース、プロセスソース、生成リソース、プロセスリソース、コンパイル、プロセスクラス、生成テストソース、プロセステストソース、生成テストリソース、プロセス-test-resources、test-compile、process-test-classes、test、prepare-package、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy]
ライフサイクルクリーン -> [プレクリーン、クリーン、ポストクリーン]
ライフサイクルサイト -> [プレサイト、サイト、ポストサイト、サイト展開]
たとえば、フローはシーケンシャルであり、デフォルトのライフサイクルでは、検証から始まり、次に初期化されます。
mvn
ieのデバッグモードを有効にすると、ライフサイクルを確認できます。mvn -X <your_goal>