Передача аргументов командной строки из Maven как свойств в pom.xml

100

Можно ли передать аргументы из командной строки в свойства в pom.xmlфайле? например я бегуmvn ... argument

и в pom.xml

<properties>
   <myproperty> here should add argument from command line</myproperty>
</properties>

Спасибо вам за помощь.

Худи
источник
Не совсем то, о чем вы просите, но профили maven могут быть полезны для этого
Sig
да, я знаю о профилях. Я использую maven-soapui-plugin, где в <projectFile> ... </projectFile> указано имя проекта. У меня около 10 проектов, и я не хочу для каждого проекта новый профиль. Я хочу использовать аргумент для запуска mvn ... project1 для запуска project1 и mvn ... project2 для запуска
project2

Ответы:

134

Для вашего примера собственности сделайте:

mvn install "-Dmyproperty=my property from command line"

Обратите внимание на цитаты вокруг определения всего свойства. Они вам понадобятся, если в вашей собственности есть пробелы.

Александр Погребняк
источник
19
Также обратите внимание, что если у вас есть и свойство в pom, и в командной строке, командная строка имеет приоритет. Это может быть полезно для предоставления переопределяемых значений по умолчанию.
Дэн Картер
2
Мы также можем передать несколько аргументов, например:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit
15

Я использовал плагин свойств, чтобы решить эту проблему.

Свойства определяются в pom и записываются в файл my.properties, где затем к ним можно получить доступ из вашего кода Java.

В моем случае это тестовый код, который должен получить доступ к этому файлу свойств, поэтому в pom файл свойств записывается в maven testOutputDirectory:

<configuration>
    <outputFile>${project.build.testOutputDirectory}/my.properties</outputFile>
</configuration>

Используйте outputDirectory, если вы хотите, чтобы свойства были доступны для кода вашего приложения:

<configuration>
    <outputFile>${project.build.outputDirectory}/my.properties</outputFile>
</configuration>

Для тех, кто ищет более полный пример (мне потребовалось немного повозиться, чтобы заставить это работать, так как я не понимал, как именование тегов свойств влияет на возможность их извлечения в другом месте файла pom), мой pom выглядит следующим образом:

<dependencies>
     <dependency>
      ...
     </dependency>
</dependencies>

<properties>
    <app.env>${app.env}</app.env>
    <app.port>${app.port}</app.port>
    <app.domain>${app.domain}</app.domain>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20</version>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>write-project-properties</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.testOutputDirectory}/my.properties</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

И в командной строке:

mvn clean test -Dapp.env=LOCAL -Dapp.domain=localhost -Dapp.port=9901

Таким образом, к этим свойствам можно получить доступ из кода Java:

 java.io.InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties");
 java.util.Properties properties = new Properties();
 properties.load(inputStream);
 appPort = properties.getProperty("app.port");
 appDomain = properties.getProperty("app.domain");
Покачиваться
источник
Мой файл свойств в java дает то же значение, что и $ {app.env}, он не выбирает его из командной строки maven, должно ли имя свойства быть равным значению, подобному этому? <app.env> $ {app.env} </ app.env>
Суджит
14

Внутри pom.xml

<project>

.....

<profiles>
    <profile>
        <id>linux64</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build_os>linux</build_os>
            <build_ws>gtk</build_ws>
            <build_arch>x86_64</build_arch>
        </properties>
    </profile>

    <profile>
        <id>win64</id>
        <activation>
            <property>
                <name>env</name>
                <value>win64</value>
            </property>
        </activation>
        <properties>
            <build_os>win32</build_os>
            <build_ws>win32</build_ws>
            <build_arch>x86_64</build_arch>
        </properties>
    </profile>
</profiles>

.....

<plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>target-platform-configuration</artifactId>
    <version>${tycho.version}</version>
    <configuration>
        <environments>
            <environment>
                <os>${build_os}</os>
                <ws>${build_ws}</ws>
                <arch>${build_arch}</arch>
            </environment>
        </environments>
    </configuration>
</plugin>

.....

В этом примере, когда вы запускаете pom без аргументов, mvn clean installбудет выполнен профиль по умолчанию.

При исполнении с mvn -Denv=win64 clean install

Профиль win64 будет выполнен.

См. Http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Abhishek2k6
источник
С какого профиля должен быть mvn clean -Pwin64?
sendon1982
6

Вы можете давать имена переменным как файлы проекта. Например, в конфигурации вашего плагина укажите только один тег, как показано ниже: -

<projectFile>${projectName}</projectFile>

Затем в командной строке вы можете передать имя проекта в качестве параметра: -

mvn [your-command] -DprojectName=[name of project]
Хариом Томар
источник
Я хочу указать имя браузера и среду в команде mvn. Если я не предоставлю, он выберет значение по умолчанию. Как это сделать?
Поль
1
mvn clean package -DpropEnv=PROD

Затем, используя это в POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
sendon1982
источник