10

一度だけ実行したいMOJOがあり、原子炉内の最後のプロジェクトのテストフェーズの後で一度だけ実行します。

使用:

if (!getProject().isExecutionRoot()) {
        return ;
}

execute()メソッドの開始時は、mojoが1回実行されることを意味しますが、ビルドの最初の段階で、他のすべての子モジュールの前に実行されます。

4

8 に答える 8

9

これに対して私が見つけた最良の解決策は次のとおりです。

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

public void execute() throws MojoExecutionException {

    // only execute this mojo once, on the very last project in the reactor
    final int size = reactorProjects.size();
    MavenProject lastProject = (MavenProject) reactorProjects.get(size - 1);
    if (lastProject != getProject()) {
        return;
    }
   // do work
   ...
}

これは、私がテストした小さなビルド階層で機能するようです。

于 2008-09-26T01:50:15.403 に答える
3

最善の解決策は、 https://issuesでメソッドが追加された ( https://maven.apache.org/examples/maven-3-lifecycle-extensions.htmlorg.apache.maven.AbstractMavenLifecycleParticipantも参照)からクラスを拡張することにより、ライフサイクル拡張に依存することです。 .apache.org/jira/browse/MNG-5640 (Maven 3.2.2 で修正済み)。afterSessionEnd

于 2016-10-13T08:25:34.610 に答える
2

これを行う方法を説明するSonatype ブログ エントリがあります。最後に実行するプロジェクトは、残りのモジュールへの参照が含まれているため、ルート プロジェクトになります。したがって、現在のプロジェクトのディレクトリが Maven が起動されたディレクトリと同じかどうかを確認するために、mojo でテストが必要です。

boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase(basedir.toString());

参照されているエントリには、モジョでこれを使用する方法のかなり包括的な例があります。

于 2009-07-28T12:18:41.497 に答える
1

@aggregatorタグを使用して、mojoを次のライフサイクルフェーズのいずれかにバインドすると、必要なものが得られると思います。

  • 準備パッケージ
  • パッケージ
  • 統合前テスト
  • 統合テスト
  • 統合後テスト
  • 確認
  • インストール
  • 配備
于 2008-09-25T12:44:42.173 に答える
1

Maven 3.x 以降、session.getEventDispatcher() を使用したソリューションは機能しなくなりました。このコミットでは、イベント全体が削除されました: https://github.com/apache/maven/commit/505423e666b9a8814e1c1aa5d50f4e73b8d710f4

于 2016-08-19T11:11:54.730 に答える
0

maven-monitor API を確認する

EventMonitor をディスパッチャに追加して、'reactor-execute' イベントの END をトラップできます。これは、すべてが完了した後、つまり BUILD SUCCESSFUL/FAILED 出力が表示された後でもディスパッチされます。

最近、最後に要約を印刷するために使用した方法は次のとおりです。

/**
 * The Maven Project Object
 *
 * @parameter expression="${project}"
 * @required
 * @readonly
 */
protected MavenProject project;


/**
 * The Maven Session.
 *
 * @parameter expression="${session}"
 * @required
 * @readonly
 */
protected MavenSession session;

...


@Override
public void execute() throws MojoExecutionException, MojoFailureException
{
    //Register the event handler right at the start only
    if (project.isExecutionRoot())
        registerEventMonitor();
    ...
}


/**
 * Register an {@link EventMonitor} with Maven so that we can respond to certain lifecycle events
 */
protected void registerEventMonitor()
{
    session.getEventDispatcher().addEventMonitor(
            new EventMonitor() {

                @Override
                public void endEvent(String eventName, String target, long arg2) {
                    if (eventName.equals("reactor-execute"))
                        printSummary();
                }

                @Override
                public void startEvent(String eventName, String target, long arg2) {}

                @Override
                public void errorEvent(String eventName, String target, long arg2, Throwable arg3) {}


            }
    );
}


/**
 * Print summary at end
 */
protected void printSummary()
{
    ...
}
于 2010-11-26T10:00:25.500 に答える
-1

通常、これは設定の問題です。モジョのためだけにプロジェクトをセットアップし、それを他のすべてのプロジェクトに依存させる必要がある場合があります。または、子プロジェクトの 1 つを他のすべての子プロジェクトに依存させることで、強制的に最後にすることもできます。

于 2008-09-25T12:31:05.717 に答える