Можно ли передать аргументы из командной строки в свойства в pom.xml
файле? например я бегуmvn ... argument
и в pom.xml
<properties>
<myproperty> here should add argument from command line</myproperty>
</properties>
Спасибо вам за помощь.
Можно ли передать аргументы из командной строки в свойства в pom.xml
файле? например я бегуmvn ... argument
и в pom.xml
<properties>
<myproperty> here should add argument from command line</myproperty>
</properties>
Спасибо вам за помощь.
Ответы:
Для вашего примера собственности сделайте:
mvn install "-Dmyproperty=my property from command line"
Обратите внимание на цитаты вокруг определения всего свойства. Они вам понадобятся, если в вашей собственности есть пробелы.
mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Я использовал плагин свойств, чтобы решить эту проблему.
Свойства определяются в 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");
Внутри 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
Вы можете давать имена переменным как файлы проекта. Например, в конфигурации вашего плагина укажите только один тег, как показано ниже: -
<projectFile>${projectName}</projectFile>
Затем в командной строке вы можете передать имя проекта в качестве параметра: -
mvn [your-command] -DprojectName=[name of project]
mvn clean package -DpropEnv=PROD
Затем, используя это в POM.xml
<properties>
<myproperty>${propEnv}</myproperty>
</properties>