03 października 2009

default-* execution dla różnych konfiguracji wtyczek w Apache Maven 2.2.1

Podczas moich ostatnich wojaży z projektami zarządzanymi Apache Maven 2 potrzebowałem możliwości zdefiniowania różnych konfiguracji dla wtyczki maven-surefire-plugin. Początkowo rozważałem taką konfigurację:
 <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/WyswietlanieKomunikatowClientTest.java</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>uruchom-WyswietlanieKomunikatowClientTest</id>
<phase>integration-test</phase>
<configuration>
<includes>
<include>**/WyswietlanieKomunikatowClientTest.java</include>
</includes>
</configuration>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
która oznacza, że domyślne wykonanie wtyczki, np. podczas wykonania mvn install, wykluczy wykonanie testów z WyswietlanieKomunikatowClientTest, podczas gdy uruchomienie mvn integration-test, albo wszystkich faz kolejnych, tj. verify, install czy deploy, już tak (warto zajrzeć na strony Introduction to the Build Lifecycle i Guide to Configuring Plug-ins#Configuring Build Plugins z dokumentacji Apache Maven, jeśli tematy są niejasne). I tutaj właśnie pojawił się problem - chcąc wykluczyć WyswietlanieKomunikatowClientTest musiałem wykonywać fazy niższe niż integration-test, a one wykluczają install. I na odwrót, wykonanie install wykona integration-test, a to nie było mi na rękę.

Zacząłem przeszukiwać Internet w poszukiwaniu rozwiązania dla konfiguracji bez phase w ramach execution wtyczki. Sądziłem, że gdzieś wokół takiego myślenia powinienem znaleźć rozwiązanie. I jakież było moje zdumienie, kiedy trafiłem na dokument Default Plugin Execution IDs, gdzie przeczytałem o podobnych dywagacjach. To odpowiadało moim potrzebom! Lektura dokumentu upewniła mnie, że mam szansę coś znaleźć w Mavenie. Na końcu dokumentu, w sekcji References, było wskazanie na dwa zgłoszenia JIRA dla Apache Maven. Pierwsze MNG-3401 niezwykle obiecujące, ale kolejne MNG-3203 odpowiadało dokładnie temu, czego poszukiwałem. Oba rozwiązane tyle tylko, że..."This should work both in Maven 2.2.0 and in Maven 3.x". U mnie niestety Maven w wersji 2.1.0:
 $ mvn -v
Apache Maven 2.1.0 (r755702; 2009-03-18 20:10:27+0100)
Java version: 1.6.0_14
Java home: c:\apps\java6\jre
Default locale: en_PL, platform encoding: Cp1250
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
Sądziłem, że pracuję z najnowszą wersją Mavena, więc nietrudno sobie wyobrazić, jak wielkie zrobiłem oczy, kiedy zobaczyłem, że wersja 2.2.1 jest już dostępna. To było dokładnie to, czego poszukiwałem. Rozwiązanie na miarę. Instalacja nowej wersji Apache Maven 2.2.1
 $ mvn -v
Apache Maven 2.2.1 (r801777; 2009-08-06 21:16:01+0200)
Java version: 1.6.0_14
Java home: c:\apps\java6\jre
Default locale: en_PL, platform encoding: Cp1250
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
zmiana konfiguracji projektu na następującą:
 <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<excludes>
<exclude>**/WyswietlanieKomunikatowKlientTest.java</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>default-test</id>
<configuration>
<includes>
<include>**/WyswietlanieKomunikatowKlientTest.java</include>
</includes>
</configuration>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
i jestem w domu! Problem rozwiązany! Teraz każdorazowe uruchomienie mvn install wykona konfigurację o identyfikatorze default-cli, a każdorazowe wykonanie mvn test, czyli dosłowne uruchomienie wtyczki surefire, która jest związana z fazą test, wykona konfigurację default-test. Dokładnie tak, jak sobie życzyłem. Warto zajrzeć do przykładowego wykonania obu poleceń i prześledzić wykonywanie wtyczek i ich execution, aby dokładnie poznać różnicę między nimi. Nie ma to jak rozwiązanie problemu w przysłowiowe 5 minut - dobrze zadane zapytanie w Google...bezcenne! :)

p.s. Jak tak dalej pójdzie, to niedługo zejdę na serce. Tyle wrażeń jednego dnia na pewno niekorzystanie wpływa na moje zdrowie :) A to tylko przy takim, pojedynczym wydarzeniu, a przecież nie było ono moim jedynym. Informatycy to strasznie podatny na zawał serca lud ;-)

p.s.2. Skoro przy temacie zarządzania projektami, to natrafiłem ostatnio na gradle. Używa ktoś tego? Chętnie wysłucham wrażeń. Komentarze, listy na priv mile widziane.

7 komentarzy:

  1. Gdybyś nie odpuszczał ostatniego spotkania JUGu to byś coś i o Gradle'u usłyszał :-)

    Ja używam, co prawda nie w produkcji, a do swoich rzeczy odrobinę i jestem bardzo zadowolony. Dla Ciebie, zapalonego Grooviowca (czy jak tam) powinno być super.

    OdpowiedzUsuń
  2. Jacek - Gradle i Maven (nie wspominajac Ant), ma sie jak Grails i Spring ;)

    Jesli tylko masz mozliwosc - zachecam. Ja podobnie jak Wojtek niestety w pracy jeszcze ;) nie moge.

    OdpowiedzUsuń
  3. Zdecydowanie powinieneś przyjrzeć się Gradleowi. Zauważ ile wysiłku kosztuje Cię w Mavenie zmuszenie go by robił to co Ty chcesz. Maven narzuca Ci swoją konwencję, co do pewnego momentu jest bardzo wygodne, ale potem krępuje Ci ruchy.

    Używałem Mavena ~3 lata, znam go dobrze. Ale kolejne projekty zamierzam robić na Gradle.

    --
    Tomek Kaczanowski
    http://kaczanowscy.pl/tomek

    OdpowiedzUsuń
  4. Nie mam już złudzeń, czym się zająć jako narzędziem do zarządzania projektami. Zdaje się, że era Mavena na moim poletku narzędziowym mija bezpowrotnie. Dzięki Mavenie, witaj Gradle :)

    OdpowiedzUsuń
  5. A ja jakoś nie poczułem Gradla, chociaż widziałem tyle, co na JUGu. Trochę mi to pachnie powrotem do czasów ANTa (imperatywne pisanie skryptów zamiast deklaratywnego mavena) z tą różnicą, że zły XML zastąpiono trendy Groovym. Co nie zmienia faktu, że chętnie poznałbym alternatywę dla m2.

    OdpowiedzUsuń
  6. W zeszłym miesiącu przeczytałem dokumentację Gradle i przyznam, że w moich projektach od tej pory będę go używał (o ile tylko będę miał taką możliwość) :)

    Pozdrawiam,
    Radek

    PS. Najnowszy IntelliJ ma mieć (tzn. już ma) wsparcie dla Gradle :)

    OdpowiedzUsuń
  7. Widać, że większość głosów ZA Gradle, ale nie brakuje jego przeciwników - patrz Tomek N. Najgorzej jest zacząć, kiedy ma się już ugruntowaną wiedzę (patrz ant, maven, gant), a tu pojawia się nowe i sieje zamęt (a przecież mamy jeszcze buildr!). Nic tylko poznawać nowe przekazywać zespołom do stosowania i próbować kolejnego. I weź tu zaproponuj to jedno rozwiązanie, kiedy klient pyta: "A co najlepsze?", albo "Od czego powinniśmy zacząć?" Przecież nie wpuszczę klienta w nowe, a stare ma znane niedociągnięcia :(

    OdpowiedzUsuń