Maven: Как изменить путь к целевому каталогу из командной строки?


82

Maven: Как изменить путь к целевому каталогу из командной строки?

(В некоторых случаях я хочу использовать другой целевой каталог)


Аналогичный вопрос stackoverflow.com/questions/13173063/…
— gavenkoa 01

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

Другой вариант использования, который я нашел для этого, - создание интеграционных тестов, например, src/it/my-integration-test-project/pom.xmlиз командной строки, без создания targetкаталога в исходном дереве, который будет скопирован, когда интеграционные тесты будут запущены как часть фазы проверки содержащего проекта.
— Майк Самуэль,

Ответы:


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
Проблема с решением профилей заключается в том, что многие варианты использования для изменения целевого каталога зависят от пользователя (например, при сборке на RAM-диск) и не относятся к pom. Профили в файле settings.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, но как правильно установить свойство в файле настроек пользователя, чтобы это было выгодно? Насколько я понимаю, из справочника по настройкам указано, что свойства, установленные в файле настроек, не будут интерполированы в файл настроек.
— Майкл Шепер

Кроме того, какое преимущество это может предложить? Вероятно, мне что-то не хватает, но если предположить, что «случаи» OP указаны в командной строке, разве это не сделает параметр -Dalt.build.dir=~/mytargetэквивалентным использованию -Dдля какого-либо другого свойства?
— Майкл Шепер

Ах, я только что понял, что все здесь говорят о добавлении профилей в POM, а не о settings.xml. Это сделало бы мои вопросы не менее m00t, чем n00b. Прости за это.
— Майкл Шепер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.