ここでは比較的新しい開発者です。少しの間使用していますが、Mavenの基礎を固めたいと思っています。私の問題の一部は、Antでnoの経験があることです。私はチュートリアルを読んで見ていますが、同じ言葉を聞き続けています:
私が学んだことから、ライフサイクルは最も広範であり、フェーズ、プラグイン、および/または目標で構成されている(または完了している)ようです。
質問:これらの用語がどのように関連し、最も一般的な例についての情報を提供できますか?
明示的かつ基本的にすればするほど良いです!
@ 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"と呼ばれるフェーズは存在しません。
参照:
MOMがPOMで目標をバインドせずに何をすべきかを知りたいと思った場合は、default-bindings.xml
にある <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml
へのリンクが最後にあります。
組み込みのライフサイクルのフェーズ(clean、default、site )は<Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xml
の下の .../<component>/<role>org.Apache.maven.lifecycle.Lifecycle
で宣言されています。
Maven:ライフサイクル対フェーズ対プラグイン対目標
このスレッドに欠けているさらに別のレベルの粒度を明確にするために遅れて答えます:executions(目標)、これはMavenビルドの最小単位です。
したがって、ビルドサイクル(基本的に、特定の全体的な目標に対する一連のアクション)があり、これはフェーズ(低い粒度、サイクルステップ)、特定のpluginsによって提供される設定済みgoalsのセットを呼び出すことができます。つまり、Mavenは(また)プラグインエグゼキューターであり、各プラグインは1つ以上の目標を提供できます。次に、(また)どの目標をどのフェーズにアタッチするかを決定します。ほとんどの場合、デフォルトのライフサイクルでは(つまり、デフォルトはありません)。しかし、実際にはさらに別のレベルを持つことができます:実行(同じ目標の、同じプラグインから、または異なるプラグインの異なる目標の)
そして実際、これは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
フェーズ(残念ながら言及されていません)>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)が明確に表示されます。
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
そして遅刻して別の図
ソース: http://www.codetab.org/Apache-maven-tutorial/ 、これは本当に良いチュートリアルです
ライフサイクル、ライフサイクルフェーズ、プラグイン、およびプラグインの目標は、Mavenの中核です。
Javaプロジェクトで「mvn package」を実行すると、次の図に示すように、Mavenはプラグインの目標をライフサイクルフェーズにバインドします。
そのため、概要を説明するためにもう少し詳しく説明します here
Mavenビルドはライフサイクルに分割されます。これらは次のとおりです。
この各サイクルはフェーズに分割されます。たとえば、ビルドは次のようなフェーズに分割されます。
フェーズには、フェーズの前pre-または後post-を実行する目標があります、 例えば:
必要に応じて、追加の「挿入」フェーズとして目標を表示できます。詳細については こちら を参照するか、 @ Gerolds answer をご覧ください。
ライフサイクルとフェーズ:Life Cycle
はphases
のコレクションです。フェーズを呼び出すと、その前にあるすべてのフェーズも呼び出されます。 Mavenには、次の3つのビルドライフサイクルが組み込まれています。
クリーンライフサイクルには、プレクリーン、クリーン、ポストクリーンの3つのフェーズがあります。デフォルトおよびサイトのライフサイクルのフェーズは、図に示すものと同じです。