2008-09-25 13 views
10

Mam MOJO Chciałbym wykonać raz, a raz tylko po fazie testowej ostatniego projektu w reaktorze do uruchomienia.Jak wymusić wykonanie maven MOJO tylko raz pod koniec kompilacji?

Zastosowanie:

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

na początku metody execute() oznacza mój mojo zostanie wykonany raz, jednak na samym początku produkcji - przed wszystkimi innymi modułami potomnych.

+0

Pozwól, że cię zrozumiem. Masz projekt nadrzędny i niektóre dzieci. Chcesz, aby ten mojo działał po teście w ostatnim projekcie potomnym. Dobrze? – sblundy

+0

Potrzebujesz również gwarancji, że działa? – sblundy

+0

~ 9 lat później ... dla Mavena 3x patrz @Konrad Windszus odpowiedź: org.apache.maven.AbstractMavenLifecycleParticipant' – earcam

Odpowiedz

-1

Zazwyczaj jest to kwestia konfiguracji. Być może trzeba będzie skonfigurować projekt tylko dla mojo i uzależnić go od wszystkich innych projektów. Możesz też zmusić jeden z projektów dzieciństwa jako ostatni, uzależniając go od wszystkich innych dzieci.

1

myślę, że dostajesz to, czego potrzebujesz, jeśli używasz @aggregator tag i związać swoje mojo do jednej z następujących etapów cyklu życia:

  • przygotować-pakiet
  • pakiet
  • wstępnej -integration test
  • integracja test
  • post-integracja-test
  • zweryfikować
  • zainstalować
  • wdrożyć
+0

To może jednak działać, ale MOJO musi zostać wykonane po fazie testowej. tj .: test mvn powinien uruchomić wszystkie testy we wszystkich submodułach, a następnie uruchomić MOJO z katalogu głównego wykonawczego. – npellow

+0

Należy również uważać na @aggregator podczas wiązania z fazami cyklu życia. "Kiedy wiąże się z cyklem życia, mojo agregatora może mieć pewne nieprzyjemne efekty uboczne, może wymusić wykonanie fazy ... cyklu życia, aby wykonać ją z wyprzedzeniem, i może spowodować kompilacje, które kończą wykonywanie fazy ... dwa razy." [ref] (http://www.sonatype.com/books/mvnref-book/reference/assemblies-sect-basics.html) – seanf

+0

+1 Twoja odpowiedź faktycznie zaoszczędziła mi dużo czasu. Dziękujemy za dodanie tagu @aggregator. –

8

Najlepsze rozwiązanie znalazłem na to:

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

To wydaje się działać na małych hierarchii kompilacji Mam testowanych.

+0

+1 To działa, ale wygląda na obejście tego problemu. Mojo jest nadal wykonywane dla każdego projektu zgłaszanego przez maven. To drobny szczegół, gdy masz 5 projektów, ale staje się wadą, gdy masz dużo. –

2

Istnieje Sonatype blog entry, który opisuje, jak to zrobić. Ostatni projekt, który zostanie uruchomiony, będzie projektem głównym, ponieważ będzie zawierał odniesienia do pozostałych elementów. Thereforec trzeba test w mojo aby sprawdzić, czy katalog bieżący projekt jest taka sama jak w katalogu, z którego Maven została uruchomiona:

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

W odwołuje wejściu jest dość wszechstronny przykład jak to wykorzystać w twój mojo.

0

Wyjazd maven-monitor API

Możesz dodać EventMonitor do dyspozytora, a następnie pułapka koniec imprezy „reaktor wykonać”: to jest wywoływane po wszystko jest zakończone, czyli nawet po wyświetleniu tworzenia skutecznych/FAILED output.

Oto jak użyłem go niedawno, aby wydrukować podsumowanie na samym końcu:

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

Otrzymuję zerowy wskaźnik podczas wywoływania session.getEventDispatcher() – h3xStream