Mavenの目標とフェーズの違い/関係は何ですか? それらは互いにどのように関連していますか?
8 に答える
目標は、目標が実行される順序を決定するのに役立つフェーズで実行されます。これを最もよく理解するには、デフォルトでどの目標がどのフェーズで実行されるかを示すデフォルトの Maven ライフサイクル バインディングを確認することです。compile
フェーズ ゴールは常にフェーズ ゴールの前に実行され、フェーズtest
ゴールは常にフェーズ ゴールの前に実行さpackage
れます。
混乱の一部は、Maven を実行するときに目標またはフェーズを指定できるという事実によって悪化します。フェーズを指定すると、Maven は指定したフェーズまでのすべてのフェーズを順番に実行します (たとえば、パッケージを指定すると、最初にコンパイル フェーズ、次にテスト フェーズ、最後にパッケージ フェーズを実行します)。そのフェーズに関連付けられているすべての目標を実行します。
Maven ビルド ファイルでプラグイン実行を作成し、ゴールのみを指定すると、そのゴールが特定のデフォルト フェーズにバインドされます。たとえば、jaxb:xjc
ゴールはデフォルトでgenerate-resources
フェーズにバインドされます。ただし、実行を指定すると、そのゴールのフェーズも明示的に指定できます。
Maven を実行するときにゴールを指定すると、そのゴールだけが実行されます。つまり、ゴールを指定すると、コードを jar にパッケージ化するゴールjar:jar
のみが実行されます。jar:jar
以前に compile ゴールを実行したり、コンパイルされたコードを他の方法で準備したりしていない場合、これはおそらく失敗する可能性があります。
ライフ サイクルは、一連の名前付きフェーズです。
フェーズは順次実行されます。フェーズの実行は、前のすべてのフェーズを実行することを意味します。プラグインは、MOJO ( Maven Old Java O object )とも呼ばれる目標のコレクションです。 類推: プラグインはクラスであり、ゴールはクラス内のメソッドです。
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 プロジェクトは、 を実行することにより、コンパイラ プラグインの compile-goal でコンパイルできますmvn compiler:compile
。
ビルド ライフサイクルは、目標の実行に順序を与えるために使用できる名前付きフェーズのリストです。
プラグインによって提供される目標は、ライフサイクルのさまざまな段階に関連付けることができます。たとえば、デフォルトでは、ゴールは フェーズにcompiler:compile
関連付けられていますが、ゴールはフェーズに関連付けられています。次のコマンドを検討してください。 compile
surefire:test
test
mvn test
上記のコマンドが実行されると、Maven はそのフェーズまでの各フェーズに関連付けられたすべてのゴールを実行しtest
ます。このような場合、Mavenはフェーズにresources:resources
関連付けられたゴールを実行し、次にというように、最終的にゴールを実行するまで続けます。process-resources
compiler:compile
surefire:test
ただし、ビルド フェーズはビルド ライフサイクルの特定のステップを担当しますが、それらの責任を実行する方法は異なる場合があります。これは、これらのビルド フェーズにバインドされたプラグインの目標を宣言することによって行われます。
プラグインの目標は、プロジェクトの構築と管理に貢献する特定のタスク (ビルド フェーズより細かい) を表します。0 個以上のビルド フェーズにバインドできます。どのビルド フェーズにもバインドされていないゴールは、直接呼び出しによってビルド ライフサイクルの外部で実行できます。実行の順序は、ゴールとビルド フェーズが呼び出される順序によって異なります。たとえば、次のコマンドを考えてみましょう。および引数はビルド フェーズであり、clean
は(プラグインの) ゴールです。package
dependency:copy-dependencies
mvn clean dependency:copy-dependencies package
これが実行される場合、clean
最初にフェーズが実行され (つまり、クリーン ライフサイクルの前のすべてのフェーズとclean
フェーズ自体が実行されます)、次にdependency:copy-dependencies
ゴールが実行されてから、最終的にpackage
フェーズ (およびその前のすべてのビルド フェーズ) が実行されます。デフォルトのライフサイクル)。
さらに、ゴールが 1 つ以上のビルド フェーズにバインドされている場合、そのゴールはそれらすべてのフェーズで呼び出されます。
さらに、ビルド フェーズには、0 個以上のゴールをバインドすることもできます。ビルド フェーズにゴールがバインドされていない場合、そのビルド フェーズは実行されません。ただし、1 つ以上のゴールがバインドされている場合は、それらすべてのゴールを実行します。
ビルトイン ライフサイクル バインディング
一部のフェーズには、デフォルトでゴールがバインドされています。デフォルトのライフサイクルでは、これらのバインディングはパッケージング値に依存します。
Maven アーキテクチャ:
Maven ライフサイクル マッピングの Eclipse サンプル
定義はMaven サイトのページIntroduction to the Build Lifecycleで詳しく説明されていますが、要約してみました。
Maven は、ビルド プロセスの 4 つの項目を定義します。
ライフサイクル
3 つの組み込みライフサイクル (ビルド ライフサイクルとも呼ばれます):
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
選択された答えは素晴らしいですが、それでもトピックに小さなものを追加したいと思います. イラストです。
さまざまなフェーズがさまざまなプラグインにどのようにバインドされているか、およびそれらのプラグインが公開する目標を明確に示しています。
それでは、次のようなものを実行するケースを調べてみましょうmvn compile
:
- コンパイルゴールでコンパイラプラグインを実行するフェーズです
- コンパイラ プラグインにはさまざまな目的があります。
mvn compile
特定の目標であるコンパイル目標にマップされているためです。 - 走るのと同じだ
mvn compiler:compile
したがって、フェーズはプラグインのゴールで構成されます。
参照へのリンク
フェーズと目標を持つ Maven 作業用語。
フェーズ: Maven フェーズは、2 つまたは 3 つの目標に関連付けられた一連のアクションです。
例:- mvn clean を実行した場合
これは、目標 mvn clean:clean を実行するフェーズです。
ゴール: フェーズに制限された Maven ゴール
参考までに http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
次の 3 つの組み込みビルド ライフサイクルがあります。
- デフォルト
- 掃除
- サイト
ライフサイクルのデフォルト-> [validate、initialize、generate-sources、process-sources、generate-resources、process-resources、compile、process-classes、generate-test-sources、process-test-sources、generate-test-resources、process -test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy]
ライフサイクル クリーン-> [プレクリーン、クリーン、ポストクリーン]
ライフサイクル サイト-> [プレサイト、サイト、ポストサイト、サイト展開]
フローはシーケンシャルです。たとえば、デフォルトのライフサイクルでは、 validateから始まり、初期化など...
mvn
つまり、デバッグモードを有効にすることでライフサイクルを確認できます。mvn -X <your_goal>