5

release:perform 目標の一部として、すべてのプロジェクトで実行するカスタム プラグインがあります。

マルチモジュール ビルドの使用を開始したばかりですが、プラグインが最上位モジュールでのみ実行されることに気付きました。リリースの最後にプラグインをすべてのモジュールで個別に実行するには、どうすればよいですか? プラグイン コード自体でそれらを反復処理する必要がありますか? もしそうなら、それを行う例はありますか?私が見るところ、 MavenProject.getModules() はそれらのモジュールの文字列名のリストを返すだけで、それらのモジュールの情報を取得する方法がわかりません(私のプラグインが必要です)それぞれの groupId:artifactId:version であり、この場合、モジュールのバージョンが常に同じであるとは限りません)。

@aggregator の有無にかかわらず試してみましたが、問題に関しては何も変わりません。

これは、プロジェクトの最上位でのみ実行され、すべてのサブモジュールに対して SKIPPED を報告する CLI から直接 (フェーズに関連付けられていない) プラグインを実行するのと同じケースであると想定しています。

Maven 3.0.3 を使用しています。

4

3 に答える 3

3

Maven プラグインにも同じ問題がありました。これは 1 回だけ呼び出されており (通常はリア​​クターの最初のモジュールに対して)、最終的にプラグインに Maven 注釈 "@requiresProject false" があることを突き止めました。Maven Reactor は、そのようなプラグインを 1 回だけ呼び出すようです。「@requiresProject true」に切り替えると、モジョはモジュールごとに1回呼び出されました。私は release:perform に引っかかっていなかったので、YMMV.

すべてのモジュールへのアクセスに関しては、名前を与える MavenProject.getModules() を使用する代わりに、次のように MavenProject オブジェクトを注入できます。

   /**
    * The projects in the reactor.
    *
    * @parameter expression="${reactorProjects}"
    * @readonly
    */
   private List<MavenProject> reactorProjects;

ライフサイクル フェーズにバインドするときは、@aggregator に注意してください。「ライフサイクルにバインドされると、アグリゲーターのモジョには厄介な副作用が生じる可能性があります。... ライフサイクル フェーズの実行を事前に強制することができ、最終的に ... フェーズを実行するビルドになる可能性があります。二回。」参照

ビルドの最後にmaven MOJOを強制的に1回だけ実行するにはどうすればよいですか? @aggregator の代替手段がいくつかあります。

于 2011-12-13T06:50:39.523 に答える
2

newmaven-plugin-annotationsを使用して、以下を注入することもできます。

@Component
private MavenSession session;

session.getProjects()(Maven 3)またはsession.getSortedProjects()(2)を呼び出します。

于 2014-03-11T21:12:46.580 に答える
0

何らかの理由@seanfでの答えがうまくいかなかったので(おそらく、私はMavenのより新しいバージョンを使用しているためですか?!)、@Parameter注釈を受け入れるようにコードを変更したところ、うまくいきました!

@Parameter(defaultValue = "${reactorProjects}", required = true, readonly = true)
private List<MavenProject> reactorProjects;
于 2021-09-29T12:26:38.230 に答える