Простой ответ: у меня есть IDE, такая как Eclipse target/, и я хочу иметь возможность строить из командной строки без того, чтобы два процесса наступали друг другу на пятки.
Джон Салливан
Другой вариант использования, который я нашел для этого, - создание интеграционных тестов, например, src/it/my-integration-test-project/pom.xmlиз командной строки, без создания targetкаталога в исходном дереве, который будет скопирован, когда интеграционные тесты будут запущены как часть фазы проверки содержащего проекта.
Большое спасибо. Почему не рекомендуется второе решение?
Игорь Мухин
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
Колин прав, что нужно использовать профиль. Однако его ответ жестко кодирует целевой каталог в профиле. Альтернативным решением было бы добавить такой профиль:
Это приведет к изменению каталога сборки на то, что задано свойством alt.build.dir, которое может быть указано в POM, в настройках пользователя или в командной строке. Если свойство отсутствует, компиляция произойдет в обычном целевом каталоге.
Извините за вопрос о n00b, но как правильно установить свойство в файле настроек пользователя, чтобы это было выгодно? Насколько я понимаю, из справочника по настройкам указано, что свойства, установленные в файле настроек, не будут интерполированы в файл настроек.
Майкл Шепер
Кроме того, какое преимущество это может предложить? Вероятно, мне что-то не хватает, но если предположить, что «случаи» OP указаны в командной строке, разве это не сделает параметр -Dalt.build.dir=~/mytargetэквивалентным использованию -Dдля какого-либо другого свойства?
Майкл Шепер
Ах, я только что понял, что все здесь говорят о добавлении профилей в POM, а не о settings.xml. Это сделало бы мои вопросы не менее m00t, чем n00b. Прости за это.
target/
, и я хочу иметь возможность строить из командной строки без того, чтобы два процесса наступали друг другу на пятки.src/it/my-integration-test-project/pom.xml
из командной строки, без созданияtarget
каталога в исходном дереве, который будет скопирован, когда интеграционные тесты будут запущены как часть фазы проверки содержащего проекта.Ответы:
Вам следует использовать профили.
<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
источник
-Dproject.build.directory
предназначены для использования, их можно будет использовать; и это способ решения-Dproject.build.directory
проблемы. Кроме того, с первым решением вы указываете пути раз и навсегда, вы не можете сделать опечатку в имени каталога при запуске командной строки, вы можете легко использовать это решение, даже если вы работаете из IDE и т. Д.settings.xml
а не через командную строку, для еще большей переносимости?Колин прав, что нужно использовать профиль. Однако его ответ жестко кодирует целевой каталог в профиле. Альтернативным решением было бы добавить такой профиль:
<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, в настройках пользователя или в командной строке. Если свойство отсутствует, компиляция произойдет в обычном целевом каталоге.
источник
-Dalt.build.dir=~/mytarget
эквивалентным использованию-D
для какого-либо другого свойства?