Maven: Jak zmienić ścieżkę do katalogu docelowego z wiersza poleceń?

82

Maven: Jak zmienić ścieżkę do katalogu docelowego z wiersza poleceń?

(W niektórych przypadkach chcę użyć innego katalogu docelowego)

Igor Mukhin
źródło
Podobne pytanie stackoverflow.com/questions/13173063/…
gavenkoa
2
Prosta odpowiedź: mam IDE, takie jak Eclipse, które wbudowuje się w target/, i chcę mieć możliwość budowania z wiersza poleceń również bez dwóch procesów nachodzących na siebie.
john sullivan,
Inny przypadek użycia, który znalazłem w tym przypadku - budowanie testów integracyjnych, takich jak src/it/my-integration-test-project/pom.xmlz wiersza poleceń, bez tworzenia targetkatalogu w drzewie źródłowym, który zostanie skopiowany, gdy testy integracyjne zostaną uruchomione w ramach fazy weryfikacji projektu zawierającego.
Mike Samuel
1
Czy to odpowiada na twoje pytanie? Kompilacja poza drzewem z mavenem. Czy to możliwe?
030

Odpowiedzi:

93

Powinieneś używać profili.

<profiles>
    <profile>
        <id>otherOutputDir</id>
        <build>
            <directory>yourDirectory</directory>
        </build>
    </profile>
</profiles>

I zacznij od swojego profilu

mvn compile -PotherOutputDir

Jeśli naprawdę chcesz zdefiniować swój katalog z wiersza poleceń, możesz zrobić coś takiego ( w ogóle NIE zalecane ):

<properties>
    <buildDirectory>${project.basedir}/target</buildDirectory>
</properties>

<build>
    <directory>${buildDirectory}</directory>
</build>

I skompiluj w ten sposób:

mvn compile -DbuildDirectory=test

Dzieje się tak, ponieważ nie możesz zmienić katalogu docelowego za pomocą -Dproject.build.directory

Colin Hebert
źródło
1
Dziękuję Ci bardzo. Dlaczego drugie rozwiązanie nie jest zalecane?
Igor Mukhin
1
@iimuhin, pierwsze rozwiązanie to poprawne wykorzystanie możliwości jakie daje konfiguracja mavena, drugie to raczej trik, aby to zadziałało. Gdyby opcje -Dproject.build.directorybyły przeznaczone do użycia, byłoby to użyteczne; i jest to obejście -Dproject.build.directoryproblemu. Dodatkowo w pierwszym rozwiązaniu określasz ścieżki raz na zawsze, nie możesz popełnić literówki w nazwie katalogu po uruchomieniu wiersza poleceń, możesz z łatwością skorzystać z tego rozwiązania, nawet jeśli pracujesz z IDE itp.
Colin Hebert,
8
Problem z rozwiązaniem profili polega na tym, że wiele przypadków użycia zmiany katalogu docelowego jest specyficznych dla użytkownika (np. Chęć kompilacji na dysk RAM) i nie należy do pliku pom. Profile w pliku settings.xml specyficznym dla użytkownika nie mogą zawierać elementu kompilacji, więc nie jest to opcja.
EricS
Uwielbiam tę odpowiedź, ale może dodam, że możesz aktywować profil za pomocą settings.xmlzamiast wiersza poleceń, aby uzyskać jeszcze większą przenośność?
Rogue 05
1
Podoba mi się twoje „niezalecane rozwiązanie”, ponieważ umożliwiło mi budowanie w wierszu poleceń w alternatywnych katalogach, bez zakłócania pracy Eclipse, które wskazuje na domyślny $ {project.basedir} / target. Dlatego mogę kodować w Eclipse, jednocześnie budując w wierszu poleceń, bez czekania, aż Eclipse odświeży / przebuduje
Francois Marot
28

Colin ma rację, że należy użyć profilu. Jednak jego odpowiedź na stałe koduje katalog docelowy w profilu. Alternatywnym rozwiązaniem byłoby dodanie takiego profilu:

    <profile>
        <id>alternateBuildDir</id>
        <activation>
            <property>
                <name>alt.build.dir</name>
            </property>
        </activation>
        <build>
            <directory>${alt.build.dir}</directory>
        </build>
    </profile>

Spowodowałoby to zmianę katalogu budowania na taki, jaki podaje własność alt.build.dir, którą można podać w POM, w ustawieniach użytkownika lub w wierszu poleceń. Jeśli właściwość nie jest obecna, kompilacja odbędzie się w normalnym katalogu docelowym.

Kricket
źródło
Przepraszam za pytanie n00b, ale jaki jest właściwy sposób ustawienia właściwości w pliku ustawień użytkownika, aby było to korzystne? Rozumiem na podstawie odniesienia do ustawień , że właściwości ustawione w pliku ustawień nie będą interpolowane w pliku ustawień.
Michael Scheper
Jakie korzyści przyniosłoby to również? Prawdopodobnie czegoś mi brakuje, ale zakładając, że `` przypadki '' OP są określone w wierszu poleceń, czy nie spowodowałoby to, że parametr byłby -Dalt.build.dir=~/mytargetrównoważny użyciu -Ddla innej właściwości?
Michael Scheper
Ach, właśnie zdałem sobie sprawę, że wszyscy tutaj mówią o dodawaniu profili do POM, a nie o settings.xml. To sprawiłoby, że moje pytania byłyby co najmniej równe m00t jak n00b. Przepraszam za to.
Michael Scheper