Passando argumentos de linha de comando do Maven como propriedades em pom.xml

97

É possível passar argumentos da linha de comando para propriedades no pom.xmlarquivo? por exemplo eu corromvn ... argument

e em pom.xml

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

Obrigado pela ajuda.

Hudi
fonte
Não diretamente o que você está pedindo, mas perfis de maven podem ser úteis para isso
Sig de
sim, eu sei sobre perfis. Estou usando o plugin maven-soapui onde em <projectFile> ... </projectFile> é o nome definido do projeto. Tenho cerca de 10 projetos e não quero para cada novo perfil de projeto. Eu quero usar o argumento para executar mvn ... projeto1 para executar projeto1 e mvn ... projeto2 para executar
projeto2

Respostas:

130

Para o seu exemplo de propriedade, faça:

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

Observe as citações em torno da definição de toda a propriedade. Você precisará deles se sua propriedade contiver espaços.

Alexander Pogrebnyak
fonte
17
Observe também que, se você tiver uma propriedade no pom e na linha de comando, a linha de comando terá precedência. Isso pode ser útil para fornecer padrões substituíveis.
Dan Carter
2
Também podemos passar vários argumentos como este, algo como:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit
14

Dentro de 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>

.....

Neste exemplo, ao executar o pom sem nenhum argumento, mvn clean installo perfil padrão será executado.

Quando executado com mvn -Denv=win64 clean install

O perfil win64 será executado.

Consulte http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Abhishek2k6
fonte
Desde o uso de qual perfil, ele deve ser mvn clean -Pwin64?
sendon1982
14

Usei o plugin de propriedades para resolver isso.

As propriedades são definidas no pom e gravadas em um arquivo my.properties, onde podem ser acessadas a partir de seu código Java.

No meu caso, é o código de teste que precisa acessar esse arquivo de propriedades, portanto, no pom, o arquivo de propriedades é gravado no testOutputDirectory do maven:

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

Use outputDirectory se desejar que as propriedades sejam acessíveis pelo código do seu aplicativo:

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

Para aqueles que procuram um exemplo mais completo (precisei mexer um pouco para fazer isso funcionar, pois não entendia como a nomenclatura de tags de propriedades afeta a capacidade de recuperá-los em outro lugar no arquivo pom), meu pom tem a seguinte aparência:

<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>

E na linha de comando:

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

Portanto, essas propriedades podem ser acessadas a partir do código 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");
mexer
fonte
Meu arquivo de propriedade em java está dando o mesmo valor que $ {app.env}, não está pegando na linha de comando do maven, o nome da propriedade deve ser igual a um valor como este? <app.env> $ {app.env} </ app.env>
Sujith
6

Você pode dar nomes de variáveis ​​como arquivos de projeto. Por exemplo, na configuração do seu plugin, dê apenas uma tag como abaixo: -

<projectFile>${projectName}</projectFile>

Então, na linha de comando, você pode passar o nome do projeto como parâmetro: -

mvn [your-command] -DprojectName=[name of project]
Hariom Tomar
fonte
Desejo fornecer o nome do navegador e o ambiente no comando mvn. Se eu não fornecer, ele selecionará o padrão. Como fazer isso?
paul
1
mvn clean package -DpropEnv=PROD

Então, usando assim em POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
sendon1982
fonte