2012-08-17 18 views
13

W Maven jest bardzo łatwy do skonfigurowania właściwości w pom z następującą składnią:W Maven, w jaki sposób mogę dynamicznie budować wartość właściwości w czasie wykonywania?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

Teraz muszę zbudować właściwość, która zależy od wersji mojego pom. Do tworzenia właściwość chcę zrobić następujące (Java pseudo kod):

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

powinna być dynamiczna, ponieważ jest on stosowany jako nazwę znacznika w repozytorium i zawsze musi być zsynchronizowane z wersją z artefakt.

Jakieś pomysły na tworzenie "dynamicznych" właściwości?

Odpowiedz

25

Build-Helper Maven Plugin Mojo może pomóc tutaj.

Istnieje szereg celów, które można wykorzystać w celu przekształcenia właściwości.

Jest

Prawdopodobnie regex-property jest jeden chcesz, ale jeśli twój v Liczby ersionów są zgodne z "standardami", które mogą zaoszczędzić ci dwaj pozostali.

Aby użyć cel regex-property byś zrobił coś

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Uwaga: mój regex może być nieco off więc należy przetestować wyżej.

Uwaga: Wartość właściwości będzie dostępna tylko dla wykonań po fazie, do której jest wykonane to wykonanie. Domyślna faza, do której jest przypisana, to validate, ale jeśli jesteś w innym cyklu życia (np. Cykl życia strony), wartość nie będzie dostępna.

+0

A jeśli nie wiążę wtyczki do fazy. Korzystam z wtyczki dodatku do programu maven i nazywam wersję docelową: przygotuj. Jak zrobić to tutaj? – EhmKah

+0

jeśli nie określisz fazy, domyślnie jest ona przypisana do fazy "sprawdzania poprawności", więc powyższy fragment kodu wykona cel, gdy faza walidacji jest aktywna. po bezpośrednim wywołaniu celu, np. 'release: prepare', co się dzieje, to to, że maven uruchamia cel bezpośrednio pomijając dowolne fazy cyklu życia, więc sam cel' release: prepare' nie zobaczy właściwości * ale * cykl życia * rozwidlony * według 'release: prepare' wyświetli to. Tak więc 'release: prepare' nie będzie w stanie użyć właściwości do oznaczania SCM, ale właściwość będzie obecna w rozwidlonej kompilacji, że wtyczka wydania działa –

+1

Jeśli chcesz mieć znacznik SCM na podstawie właściwości (powinieneś zaktualizować Twoje pytanie, aby odzwierciedlić, że jest to twój cel lub rozpocząć drugie pytanie), może być konieczne użycie czegoś takiego jak http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormat to nie da ci podstawienia '_', które chcesz, ani zastrzyku' _P'. Zalecam zmianę wymagań dotyczących nazw tagów, zamiast próbować zginać Mavena ;-) –

2

Możesz użyć wtyczki build-helper, w szczególności jego regex-property mojo. Spójrz na usage examples (przejdź do: Ustaw właściwość, stosując wyrażenie regularne do sekcji o wartości).

Zasadniczo chcesz coś takiego w swojej pom dostać myVersionTag nieruchomość wywnioskował z myValue:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

Oznacziłbym tę odpowiedź jako zaakceptowaną, ponieważ jest taka sama jak powyżej. Dziękuję Ci. – EhmKah

+1

Niezupełnie. Przykład Ihora umieszcza "\" pomiędzy "$" i "{" w elemencie . Tak mówi o tym dokument Codehausa, ale jest nie tak. Cel regex-property nie działa z odwrotnym ukośnikiem i działa bez niego. A Codehaus jest nieczynny. –

+0

@SteveCohen Jeśli dokumenty są nieprawidłowe, proszę otworzyć problem https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise

2

Odpowiedź Ihor Kaharlichenko jest w zasadzie poprawna, z tym że kopiuje błąd z Codehaus documentation. Nie powinno być "\" między "$" a "{". Mojo działa bez niego i nie działa z nim. Naprawdę, z podstawową znajomością regex i Maven, nie mogłem zobaczyć, co powinien zrobić backslash i rzeczywiście jest to złe.

Odpowiedź Stephena Connolly poprawnie pomija ukośnik odwrotny. Bądź ostrożny.
Błąd ten rozprzestrzenił się na całym SO, a z powodu nieobecności Codehaus prawdopodobnie nigdy nie zostanie naprawiony.

Powiązane problemy