web-dev-qa-db-ja.com

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

ここでは比較的新しい開発者です。少しの間使用していますが、Mavenの基礎を固めたいと思っています。私の問題の一部は、Antでnoの経験があることです。私はチュートリアルを読んで見ていますが、同じ言葉を聞き続けています:

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

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

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

明示的かつ基本的にすればするほど良いです!

96
Jeff Levine

@ Drejc's answer は全体が正しくありません。

特に:

このフェーズのそれぞれには、実行する目標があります たとえば、事前または事後のフェーズ:

• プレインストール-...
• ポストパッケージ-...

必要に応じて、追加の「挿入」フェーズとして目標を表示できます。

[私による誤った記述の取り消し線。]

Mavenライフサイクルは、すべてのsteps(またはそれ以上:すべてのステップをカバーする(抽象的な)概念ですMavenデザイナーは、プロジェクトの開発期間中に発生すると予想されるをサポートすることを決定しました。これらのステップ(または段階)はMavenの用語ではphasesと呼ばれます。

A Maven plugin is a container for/supplier of goals. Code implemented in goals is the real workhorse. ( Maven in its core itself is just managing plugins and executing goals ). Each of a plugin's goals can be assigned/bound to any of the lifecycle phases.

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

つまりMavenのビルトインライフサイクルの1つに "追加フェーズを挿入"することはできません。彼らはすでにそこにいます、いつも!独自のフェーズで独自のライフサイクルを開発することもできますが、それは単にMavenをそのまま使用することをはるかに超えています。

"pre-install"または "post-package"と呼ばれるフェーズは存在しません。

参照:

63
Gerold Broser

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

このスレッドに欠けているさらに別のレベルの粒度を明確にするために遅れて答えます:executions(目標)、これはMavenビルドの最小単位です。

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

全体を再開する準備をした写真 enter image description here

そして実際、これはMavenがビルドログの一意の文字列を介して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 Compilerプラグイン(artifactIdおよびversion)を呼び出しています>
  • compile 目標を呼び出しています>
  • default-compile実行で定義されている

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

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

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

短くするために:実行は、どのフェーズでどの設定でどのゴールを実行するかをMavenに指示します。

一部の実行はデフォルトで提供されます(デフォルトのバインディング)。これは、ちょうど6行の maven minimal pom がすでに多くのことを実行できる理由を説明しています(コンパイル、テスト、パッケージなど):特定のフェーズで標準プラグインの目標を実行します:構成よりも規約です。次に、pom.xml構成を介して、ビルドにstuff(実行)を追加したり、既に構成されたプラグインの動作に影響を与えたりできます(この場合はexecutionsセクションはありませんが、 configurationで十分です)。

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

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

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

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

追伸同じexecutionに対して複数の目標を指定する場合、ビルドログには、2つの異なる目標(したがって一意のTuple)の2つの異なる実行(同じID)が明確に表示されます。

40
A_Di-Matteo

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

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

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

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

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

Life Cycleは、phaseのコレクションです。ここを参照してください- ライフサイクルリファレンスphaseを呼び出すと、その前にあるすべてのphasesも呼び出します。

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

mvn clean

pre-cleanおよびcleanを呼び出します。

2。プラグインと目標

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

次のような目標を呼び出すことができます。

mvn clean:clean

これは、「クリーンプラグインでクリーンゴールを呼び出す」ことを意味します(ここではクリーンフェーズに関連するものはありません。混乱させないでください。

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

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

mvn clean

Pre:cleanフェーズとclean:cleanゴールにリンクするcleanフェーズを呼び出します。

以下とほぼ同じです。

mvn pre-clean clean:clean
16

そして遅刻して別の図

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

Maven Lifecycles, Phases, Goals, Plugins

14
David Tonhofer

ソース: http://www.codetab.org/Apache-maven-tutorial/ 、これは本当に良いチュートリアルです

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

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

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

mvn-plugins-package-goal

10
Erlan

そのため、概要を説明するためにもう少し詳しく説明します here

Mavenビルドはライフサイクルに分割されます。これらは次のとおりです。

  • 掃除
  • ビルド(デフォルト)
  • サイト

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

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

フェーズには、フェーズの前pre-または後post-を実行する目標があります、 例えば:

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

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

7
Drejc

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

  1. クリーンライフサイクル-これには、プロジェクトのクリーニングが含まれます(新規ビルドおよび展開の場合)
  2. デフォルト/ビルドライフサイクル-これはプロジェクトの完全な展開を処理します
  3. サイトのライフサイクル-これは、プロジェクトのJavaドキュメントの生成を処理します。 enter image description here

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

3
Arun Raaj