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. Прости за это.
Майкл Шепер