Maven:ライフサイクルvsフェーズvsプラグインvs目標
このスレッドに欠けているさらに別のレベルの細分性を明確にするために遅く答える:実行 Mavenビルドの最小単位である(目標の)。
したがって、特定のプラグインによって提供される一連の構成された目標を呼び出すことができるフェーズ(低い粒度、サイクルステップ)で構成されるビルドサイクル(基本的に、特定の全体的な目標に対する一連のアクション)があります。つまり、Mavenは(また)プラグイン実行プログラムであり、各プラグインは1つ以上の目標を提供できます。次に、(また)どの目標がどのフェーズに関連付けられるかを決定します。ほとんどの場合、デフォルトのライフサイクル(デフォルトなし)です。しかし、実際にはさらに別のレベルを持つことができます:実行(同じ目標、同じプラグインから、または異なるプラグインからの異なる目標)
全体を再開するために用意した写真
そして実際、これは、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コンパイラプラグイン(
artifactId
およびversion
)を呼び出しています>
- 私はその
compile
目標を呼び出しています>
default-compile
実行によって定義される
確かに、異なるフェーズまたは同じフェーズにバインドされた(同じプラグインの)同じ目標を持つことができるが、実行が異なる(つまり、構成が異なる)ため、これはユニークです。maven-compiler-plugin
例えば、また、中に使用されるtest-compile
位相(それを介してテストコードコンパイルする(異なる相)testCompile
(異なる実行において目標を)default-testCompile
)。また、POM(および場合によっては異なる構成)で指定した実行によって定義された別のフェーズで自動生成されたコードを(同じプラグインと目標を使用して)コンパイルすることもできます。
デフォルトの実行は、Mavenパッケージバインディングを介してすぐに提供されます。つまり、デフォルトで(および構成に対して規則が適用されます)、Mavenは特定のフェーズで(標準プラグインの)特定の目標をすでに呼び出しています。これらのデフォルトの呼び出しの実行IDは、特定の規則に従って定義されます。
これは、Mavenビルドのデフォルトの動作(バインディング)を本当にオーバーライドしたい場合に、同じプラグインのPOMでまったく同じ実行IDを指定(オーバーライド)する必要がある理由も説明します。たとえば、maven-compiler-plugin
同じdefault-compile
idであるが存在しないフェーズ(または空のフェーズ)にバインドされたの実行を定義するだけで、コンパイルをスキップできます。
簡潔にするために、実行はMavenにどのフェーズでどの構成でどの目標を実行するかを指示します。
一部の実行はデフォルトで提供されます(デフォルトのバインディング)。これにより、6行のmaven最小pomがすでに多くのことができる理由(コンパイル、テスト、パッケージなど)がわかります。特定のフェーズで標準プラグインの目標を実行する構成。次に、構成を介して、ビルドにスタッフ(実行)を追加したり、すでに構成されているプラグインの動作に影響を与えたりできます(この場合、セクションはありませんが、それだけで十分です)。pom.xml
executions
configuration
はい、ビルドサイクル(およびそのフェーズ)をスキップして、(プラグインの)目標を直接呼び出すことができます。以下を想像してみてください:
mvn compiler:compile
mvn compiler:testCompile
mvn surefire:test
mvn jar:jar
(注:1回の呼び出しでインラインを呼び出すこともできます)
ここでは、アプリコード、テストコードをコンパイルし、テストとパッケージを実行します。これが手動で、エラーが発生しやすく、反復的で時間がかかる方法を想像してください。構成に関する規約は私たちを助けます:Mavenはビルドのライフサイクルとフェーズを導入します。デフォルトのライフサイクル(名前なし、つまりデフォルト)は、ベストプラクティスと規則(Mavenのマントラ)に基づいてさまざまなフェーズを提供します。
上記と同じようにしたい場合は、次のコマンドを実行するだけmvn package
です。プロジェクトが自動的にコンパイル、テスト、パッケージ化されます。どうやって?プラグインを呼び出します。つまり、フェーズは、意味のある構成可能なプラグイン(目標)実行のセットです。さらに標準にするために、各フェーズでMavenは最初に先行するフェーズを起動します。たとえば、テストしたい場合は、最初にコンパイルすることを確認します。
psは、同じに複数の目標を指定する場合execution
、2つの異なる目標(したがって、依然として一意のタプル)の2つの異なる実行(同じIDを持つ)をビルドログにはっきりと表示することに注意してください。