2010-10-11 2 views
62

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

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

+0

Похожий вопрос HTTP: // StackOverflow. ком/вопросы/1317306 3/out-of-tree-build-with-maven-is-it-possible – gavenkoa

+2

Простой ответ: У меня есть IDE, например, построение Eclipse в 'target /', и я хочу, чтобы иметь возможность строить из командной строки, как ну без двух процессов, наступающих друг на друга. –

+0

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

ответ

65

Вы должны использовать профили.

<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

+0

Большое спасибо. Почему второе решение не рекомендуется? –

+1

@iimuhin, первое решение - правильное использование возможностей, предоставляемых конфигурацией maven, вторая - более трюк, чтобы заставить его работать. Если бы были использованы опции '-Dproject.build.directory', это было бы полезно; и это является обходным путем для проблемы '-Dproject.build.directory'. Плюс с первым решением вы определяете пути раз и навсегда, вы не можете сделать опечатку в имени каталога при запуске командной строки, вы можете легко использовать это решение, даже если вы работаете с IDE и т. Д. –

+5

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

23

Колина правильно, что профиль должен быть использован. Однако его ответ жестко задает целевой каталог в профиле. Альтернативным решением было бы добавить профиль, как это:

<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 , в настройках пользователя или в командной строке. Если этого свойства нет, компиляция произойдет в обычном целевом каталоге.

+0

Извините за вопрос n00b, но каким образом можно установить свойство в файле настроек пользователя, чтобы это было выгодно ? Я понимаю, что из [Настройки] (http://maven.apache.org/settings.html) указано, что свойства, заданные в файле настроек, не будут интерполированы в файле настроек. –

+0

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

+0

А, я только что понял, что все здесь говорят о добавлении профилей в POM, а не в settings.xml. Это сделало бы мои вопросы хотя бы как m00t как n00b. Извини за это. –

5

Мое решение:

  • в pom.xml:

    команда
    <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-jar-plugin</artifactId> 
         <version>2.3.2</version> 
         <configuration> 
          <outputDirectory>${dir}</outputDirectory> 
         </configuration> 
        </plugin> 
    
  • в Баш:

    mvn package -Ddir="/home/myuser/"

+2

Это не изменяет целевой каталог (project.build.directory). Он просто изменяет директиву вывода для одного плагина. – fnt