Różne zależności dla różnych profili kompilacji

115

Czy można mieć inny zestaw zależności w pliku maven pom.xml dla różnych profili?

na przykład

mvn -P debug
mvn -P release

Chciałbym pobrać inny plik jar zależności w jednym profilu, który ma te same nazwy klas i różne implementacje tych samych interfejsów.

izb
źródło
Można tego użyć podczas kierowania na różne serwery internetowe. Na przykład podczas budowania dla serwera JavaEE 5, który oferuje biblioteki, takie jak JAXB, których nie należy umieszczać w pliku wojennym, w przeciwieństwie do budowania dla serwera JavaEE 1.4, w którym należy dołączyć plik jar JAXB.
Leonel

Odpowiedzi:

174

Cytując dokumentację Mavena na ten temat :

Element profilu zawiera zarówno opcjonalną aktywację (wyzwalacz profilu), jak i zestaw zmian, które należy wprowadzić w POM, jeśli ten profil został aktywowany. Na przykład projekt utworzony dla środowiska testowego może wskazywać na inną bazę danych niż ta z końcowego wdrożenia. Lub zależności mogą być pobierane z różnych repozytoriów w zależności od używanej wersji JDK .

(Podkreślenie jest moje)

Po prostu umieść zależność dla releaseprofilu w samej deklaracji profilu i zrób to samo dla debug.

<profiles>
    <profile>
        <id> debuguj </id>
        …
        <zależności>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
    <profile>
        <id> wydanie </id>
        …
        <zależności>
            <dependency>… </dependency>
        </dependencies>
        …
    </profile>
</profiles>
Aleksandar Dimitrov
źródło
2
Ta metoda spowoduje nierozwiązanie kodu w trybie edycji. Jeśli debugowanie jest aktywne, będzie brakować jar zależności wydania, a kod będzie zawierał błąd. Jak to rozwiązać?
brucenan
6
w hierarchii zależności można ustawić zakres zależności konkretnego wydania jako „dostarczony” i zresetować zakres na „kompiluj” w sekcji profilu wersji. Aby zależność była dostępna dla kompilacji, ale nie w ostatecznej wojnie o profil „debugowania”.
uday
@uday Gdybyś umieścił odpowiedź wskazującą na to podejście, chciałbym to zagłosować
javadba
Profile IMHO są bezużyteczne, przynajmniej dla zależności: IDE generują błędy, zależności przestają być rozwiązywane, aplikacje w końcu nie działają. Spodziewałem się więcej.
Ares
6

Twój groupId, artifactId powinien być tokenizowany w twoich profilach jako właściwości i możesz przenieść swoje zależności do sekcji ogólnej.


źródło
2
Dzieje się tak tylko wtedy, gdy masz 1 zależność. Jeśli liczba zależności różni się między debugowaniem a wydaniem, po prostu tokenizacja nie zadziała. W związku z tym radziłbym nie tokenizować i wyraźnie definiować deps w sekcji profilu.
Marcel Overdijk
Druga odpowiedź nie zadziałała dla mnie, ponieważ domyślne zależności profilu były nadal uwzględniane wraz z innymi określonymi zależnościami profilu. Twoja odpowiedź zadziałała dobrze.
Vlad Mihalcea
@Vlad Czy usunąłeś zależność z głównej części POM? W przeciwnym razie będziesz mieć to dwa razy. (Zobacz stackoverflow.com/q/24855678/6944068, aby dowiedzieć się, jak upewnić się, że jeden profil jest zawsze aktywny.)
toolforger