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


97

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

та в pom.xml

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

Дякую за допомогу.


Не прямо те, про що ви просите, але профілі maven можуть бути для цього корисними
Sig

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

Відповіді:


130

Для прикладу власності:

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

Зверніть увагу на лапки навколо цілого визначення властивості. Вони вам знадобляться, якщо у вашому ресурсі є пробіли.


17
Зауважте також, що якщо у вас є властивість і в pom, і в командному рядку, командний рядок має перевагу. Це може бути корисно для надання виправних значень за замовчуванням.
дан Картер

2
Ми також можемо передати кілька аргументів , як це теж, що - щось на кшталт:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
SUMIT

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


Оскільки користуватися профілем, чи повинен він бути чистим mvn -Pwin64?
sendon1982

14

Я використовував плагін властивостей, щоб вирішити це.

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

У моєму випадку це тестовий код, який повинен отримати доступ до цього файлу властивостей, тож у файлі властивостей файл записується в testOutputDirectory maven:

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

Використовуйте outputDirectory, якщо ви хочете, щоб властивості були доступні кодом програми:

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

Для тих, хто шукає більш повний приклад (мені знадобилося трохи хизуватися, щоб це було нормально, оскільки я не розумів, як іменування тегів властивостей впливає на можливість їх отримання в іншому файлі пам’яті), мій 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>
Sujith

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.