2011-01-13 22 views
27

Potrzebuję zmodyfikować kompilację maven dla dużego projektu, aby pominąć pewne kroki podczas typowych kompilacji rozwojowych (tj. Nie budować plików * -source.jar). Szukałem "warunkowej egzekucji" dla maven, ale niczego nie znalazłem.Używanie profilów maven do kontrolowania wykonania kompilacji

Profil dewelopera brzmi jak intuicyjny sposób na zrobienie tego - ale nie wiem, jak intuicyjny maven. Dokumenty dla profili pokazują, jak ustawić różne właściwości (tj. Parametry połączenia z bazą danych) dla różnych profili. Przypuszczam, że mógłbym ustawić właściwość, a następnie przetestować, czy właściwość ta jest ustawiona w znaczniku maven-source-plugin - executions - execution.

Czy to jest właściwy sposób wykonywania warunkowego wykonywania w maven?

Co to jest "właściwy" sposób na zrobienie tego w maven?

Odpowiedz

33

Myślisz o tym trochę wstecz: profil zezwala na zachowanie, nie wyłączaj go. Właśnie do tego profile są najlepsze i dokładnie tak jest: chcesz tylko, aby kroki były uruchamiane w pewnych okolicznościach. Więc może masz coś takiego:

<profile> 
    <id>source-jars</id> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 

I w rzeczywistości nie jest przykład jak ten na maven-source-plugin usage page. Kiedy potrzebujesz wygenerować swój artefakt, użyj mvn -P source-jars (lub cokolwiek innego). To jest to! Jeśli chcesz to zrobić tylko w czasie publikacji, funkcja release plugin umożliwia nawet zdefiniowanie profili, które będą używane bezpośrednio w konfiguracji wtyczki wydania.

+0

Nasze poms są pisane domyślnie, domyślnie maven-source-plugin, więc będę musiał je zrestrukturyzować, tak jak sugerujesz. –

+3

Istnieje wiele przypadków, w których wtyczki powinny być domyślnie włączone i wyłączone przy użyciu profilu. Myślę, że ta odpowiedź pozwala uniknąć problemu bez jego rozwiązania. – Kevin

+1

@Mowgli Ale system profili maści nie jest do tego odpowiedni: istnieje tylko mechanizm "aktywacji", a nie mechanizm "dezaktywacji". Niektóre wtyczki radzą sobie z tym, tworząc własny mechanizm dezaktywacji (np. SkipTests for surefire plugin). –

6

Możesz osiągnąć swój faktyczny cel włączenia wtyczki źródła-jars domyślnie poprzez dodanie dwóch profili do POM. W Maven profiles documentation zauważa, że ​​można dodać element <activeByDefault>true</activeByDefault> do sekcji activation i stwierdza, że ​​

Ten profil będzie automatycznie aktywna przez cały buduje chyba że inny profil w tym samym POM jest aktywowany za pomocą jednej z opisanych wcześniej metod

Można więc dodać dwa profile, z których jeden to activeByDefault, który zawiera odpowiednią wtyczkę, i drugi, który można aktywować w dowolny standardowy sposób (na przykład -P z wiersza poleceń), aby zapobiec domyślnemu profil z uruchomieniem. Sekcja w swoim pom.xml (lub ustawieniami Mavena lub cokolwiek) profiles może zatem wyglądać następująco:

<profile> 
    <id>source-jars</id> 
    <activation> 
    <activeByDefault>true</activeByDefault> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-source-plugin</artifactId> 
     ... 
     </plugin> 
    </plugins> 
    </build> 
</profile> 
<profile> 
    <!-- active this profile to disable the source-jars plugin --> 
    <id>no-optional-plugins</id> 
</profile> 

Niestety, nie widzę sposobu, aby ta metoda skalowania dobrze do zwalczania wielu wtyczek - Myślę, że trzeba Profile O(n^2) dla wtyczek n, ale w tym prostym przypadku powinno działać dobrze.

Innym ewentualnie prostsza opcja z Maven ≥ 2.0.10 jest po prostu mieć profil source-jars z góry (wciąż activeByDefault) oraz manually deactivate the profile kiedy chcesz poprzedzając identyfikator profilu z - lub ! po flagi -P CLI:

$ mvn -P !source-jars 

Ta metoda nie ma takich samych problemów z O(n^2) z wieloma wtyczkami, ale jest również mniej elastyczna, ponieważ dezaktywacja nie może zostać uruchomiona przez właściwość systemu, zmienną środowiskową, wersję JDK itp.

+0

dzięki, ten przykład Pod warunkiem, że naprawdę mi pomógł – Hoto

Powiązane problemy