我有一個MOJO我想執行一次,並且只有在反應堆上一個項目的測試階段運行後才執行一次。你如何迫使一個maje MOJO在構建結束時只執行一次?
使用:
if (!getProject().isExecutionRoot()) {
return ;
}
在execute()方法的開始意味着我的魔力被執行一次,但是在構建之初 - 所有其他子模塊之前。
我有一個MOJO我想執行一次,並且只有在反應堆上一個項目的測試階段運行後才執行一次。你如何迫使一個maje MOJO在構建結束時只執行一次?
使用:
if (!getProject().isExecutionRoot()) {
return ;
}
在execute()方法的開始意味着我的魔力被執行一次,但是在構建之初 - 所有其他子模塊之前。
通常,這是一個配置問題。您可能必須爲mojo設置一個項目,並使其依賴於所有其他項目。或者,您可以強制其中一個子項目最後依靠所有其他子項目。
我想你可能會得到你所需要的,如果你使用@aggregator標籤和你的魔力結合以下生命週期階段之一:
這可能有效,但是,MOJO需要在測試階段後執行。 ie:mvn test 應運行所有子模塊中的所有測試,然後運行執行根目錄的MOJO。 – npellow 2008-09-26 00:03:41
另外,當綁定到生命週期階段時,請注意@aggregator。 「當綁定到一個生命週期時,聚合器mojo會產生一些令人討厭的副作用,它可能會迫使執行生命週期階段提前執行,並可能導致生成最終執行...階段兩次。」 [ref](http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html) – seanf 2011-12-13 06:48:31
我發現這個最好的解決辦法是:
/**
* 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
...
}
這似乎對我已經測試了小身材層次的工作。
有一個Sonatype blog entry描述如何做到這一點。最後一個要運行的項目將是根項目,因爲它將包含其餘的模塊引用。 Thereforec你需要在你的魔力測試,以檢查當前項目的目錄是一樣的,從哪裏Maven的啓動目錄:
boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase(basedir.toString());
在所涉及的條目有如何在使用一個相當完整的例子你的魔咒。
您可以將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()
{
...
}
使用session.getEventDispatcher(解決方案),因爲Maven的3.x中不再工作https://github.com/apache/maven/commit/505423e666b9a8814e1c1aa5d50f4e73b8d710f4
最好的解決辦法是通過從org.apache.maven.AbstractMavenLifecycleParticipant
擴展你的類依賴於一個生命週期延長(見https://maven.apache.org/examples/maven-3-lifecycle-extensions.html),它有一個方法afterSessionEnd
與https://issues.apache.org/jira/browse/MNG-5640添加(固定的Maven 3.2.2:整個三項賽已在此承諾被刪除)。
讓我確定我理解你。你有一個父項目和一些孩子。你希望這個mojo在最後一個子項目的測試後運行。對? – sblundy 2008-09-25 12:48:04
另外,你需要保證它運行嗎? – sblundy 2008-09-25 12:50:42
〜9年後...對於Maven 3x請參閱@Konrad Windszus回答:`org.apache.maven.AbstractMavenLifecycleParticipant` – earcam 2017-07-31 17:45:01