Maven: Як змінити шлях до цільового каталогу з командного рядка?


82

Maven: Як змінити шлях до цільового каталогу з командного рядка?

(У деяких випадках я хочу використовувати інший цільовий каталог)



2
Проста відповідь: у мене є IDE, така як Eclipse, яка вбудовується target/, і я хочу мати можливість будувати з командного рядка також без двох процесів, що наступають один одному на пальці.
Джон Салліван

Ще один випадок використання, який я знайшов для цього, - створення інтеграційних тестів, як src/it/my-integration-test-project/pom.xmlз командного рядка, без створення targetкаталогу в дереві джерела, який буде скопійовано, коли інтеграційні тести будуть запущені як частина перевіряючої фази проекту.
Mike Samuel

1
Це відповідає на ваше запитання? Поза деревом побудований з Maven. Це можливо?
030

Відповіді:


93

Слід використовувати профілі.

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

І почніть maven зі свого профілю

mvn compile -PotherOutputDir

Якщо ви дійсно хочете визначити свій каталог із командного рядка, ви можете зробити щось подібне ( НЕ рекомендується взагалі ):

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

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

І компілюйте так:

mvn compile -DbuildDirectory=test

Це тому, що ви не можете змінити цільовий каталог за допомогою -Dproject.build.directory


1
Дуже дякую. Чому друге рішення не рекомендується?
Ігор Мухін

1
@iimuhin, перше рішення - це правильне використання можливостей, наданих конфігурацією maven, друге - це більше фокус, щоб змусити його працювати. Якби варіанти -Dproject.build.directoryбули призначені для використання, вони були б корисними; і це вирішення -Dproject.build.directoryпроблеми. Плюс з першим рішенням ви вказуєте шляхи раз і назавжди, ви не можете робити друкарську помилку в назві каталогу під час запуску командного рядка, ви можете легко використовувати це рішення, навіть якщо ви працюєте з IDE тощо
Колін Hebert

8
Проблема вирішення профілів полягає в тому, що багато випадків використання для зміни цільового каталогу є специфічними для користувача (наприклад, бажання побудувати на оперативному диску) і не належать до pom. Профілі в налаштуваннях користувача.xml не можуть містити елемент побудови, тому це не є опцією.
EricS

Мені подобається ця відповідь, але, можливо, включіть, що ви можете активувати профіль за допомогою settings.xmlкомандного рядка для ще більшої портативності?
Rogue

1
Мені подобається ваше "нерекомендоване рішення", оскільки воно дозволило мені використовувати командний рядок в альтернативних каталогах, таким чином, не заважаючи Eclipse, який вказує на типовий $ {project.basedir} / target. Отже, я можу кодувати Eclipse, одночасно будуючи командний рядок, не чекаючи оновлення / відновлення Eclipse
Франсуа Маро,

28

Колін правильно, що слід використовувати профіль. Однак його відповідь жорстко кодує цільовий каталог у профілі. Альтернативним рішенням було б додати такий профіль:

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

Це призведе до зміни каталогу побудови на те, що надано властивістю alt.build.dir, яке можна вказати в POM, в налаштуваннях користувача або в командному рядку. Якщо властивості немає, компіляція відбуватиметься у звичайному цільовому каталозі.


Вибачте за питання n00b, але який відповідний спосіб встановити властивість у файлі налаштувань користувача, щоб це було вигідно? Я розумію, що з посилання на налаштування зазначено, що властивості, встановлені у файлі налаштувань, не будуть інтерпольовані у файлі налаштувань.
Michael Scheper

Крім того, яку перевагу матиме ця пропозиція? Я, мабуть, чогось пропускаю, але якщо припустити, що «випадки» OP вказані в командному рядку, чи не буде це просто зробити параметр -Dalt.build.dir=~/mytargetеквівалентним використанню -Dдля деяких інших властивостей?
Michael Scheper

Ах, я щойно зрозумів, що всі тут говорять про додавання профілів до POM, а не про settings.xml. Це зробило б мої запитання принаймні такими ж m00t, як n00b. Вибач за це.
Michael Scheper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.