2008-09-25 13 views
10

我有一個MOJO我想執行一次,並且只有在反應堆上一個項目的測試階段運行後才執行一次。你如何迫使一個maje MOJO在構建結束時只執行一次?

使用:

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

在execute()方法的開始意味着我的魔力被執行一次,但是在構建之初 - 所有其他子模塊之前。

+0

讓我確定我理解你。你有一個父項目和一些孩子。你希望這個mojo在最後一個子項目的測試後運行。對? – sblundy 2008-09-25 12:48:04

+0

另外,你需要保證它運行嗎? – sblundy 2008-09-25 12:50:42

+0

〜9年後...對於Maven 3x請參閱@Konrad Windszus回答:`org.apache.maven.AbstractMavenLifecycleParticipant` – earcam 2017-07-31 17:45:01

回答

-1

通常,這是一個配置問題。您可能必須爲mojo設置一個項目,並使其依賴於所有其他項目。或者,您可以強制其中一個子項目最後依靠所有其他子項目。

1

我想你可能會得到你所需要的,如果你使用@aggregator標籤和你的魔力結合以下生命週期階段之一:

  • 準備包
  • 預 - 整合測試
  • 集成測試
  • 整合後的測試
  • 驗證
  • 安裝
  • 部署
+0

這可能有效,但是,MOJO需要在測試階段後執行。 ie:mvn test 應運行所有子模塊中的所有測試,然後運行執行根目錄的MOJO。 – npellow 2008-09-26 00:03:41

+0

另外,當綁定到生命週期階段時,請注意@aggregator。 「當綁定到一個生命週期時,聚合器mojo會產生一些令人討厭的副作用,它可能會迫使執行生命週期階段提前執行,並可能導致生成最終執行...階段兩次。」 [ref](http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html) – seanf 2011-12-13 06:48:31

8

我發現這個最好的解決辦法是:

/** 
* 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 
    ... 
} 

這似乎對我已經測試了小身材層次的工作。

2

有一個Sonatype blog entry描述如何做到這一點。最後一個要運行的項目將是根項目,因爲它將包含其餘的模塊引用。 Thereforec你需要在你的魔力測試,以檢查當前項目的目錄是一樣的,從哪裏Maven的啓動目錄:

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

在所涉及的條目有如何在使用一個相當完整的例子你的魔咒。

0

退房maven-monitor API

您可以將EventMonitor添加到調度員,然後陷阱「反應器,執行」事件的結束:一切都完成後,該分派,即即使你看到BUILD SUCCESSFUL /失敗輸出。

以下是我用它最近就在結束打印摘要:

/** 
* 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() 
{ 
    ... 
}