Übergeben von Befehlszeilenargumenten von Maven als Eigenschaften in pom.xml

97

Ist es möglich, Argumente von der Befehlszeile an Eigenschaften in der pom.xmlDatei zu übergeben? Zum Beispiel renne ichmvn ... argument

und in pom.xml

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

Danke für die Hilfe.

hudi
quelle
Nicht direkt das, wonach Sie fragen, aber Maven-Profile können dafür nützlich sein
Sig
Ja, ich kenne mich mit Profilen aus. Ich verwende das Maven-Soapui-Plugin, wobei in <projectFile> ... </ projectFile> der Name des Projekts definiert ist. Ich habe ungefähr 10 Projekte und ich möchte nicht für jedes Projekt ein neues Profil erstellen. Ich möchte Argument verwenden, um mvn ... project1 auszuführen, um project1 und mvn ... project2 auszuführen, um project2
auszuführen

Antworten:

130

Für Ihr Immobilienbeispiel tun Sie Folgendes:

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

Beachten Sie Anführungszeichen zur Definition der gesamten Eigenschaft. Sie benötigen sie, wenn Ihre Immobilie Leerzeichen enthält.

Alexander Pogrebnyak
quelle
17
Beachten Sie auch, dass die Befehlszeile Vorrang hat, wenn Sie sowohl eine Eigenschaft im POM als auch in der Befehlszeile haben. Dies kann nützlich sein, um überschreibbare Standardeinstellungen bereitzustellen.
Dan Carter
2
Wir können auch mehrere Argumente wie dieses übergeben, so etwas wie:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit
14

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

..... .....

In diesem Beispiel wird das mvn clean installStandardprofil ausgeführt, wenn Sie den POM ohne Argument ausführen.

Bei Ausführung mit mvn -Denv=win64 clean install

Das win64-Profil wird ausgeführt.

Weitere Informationen finden Sie unter http://maven.apache.org/guides/introduction/introduction-to-profiles.html

Abhishek2k6
quelle
Sollte es seit der Verwendung von welchem ​​Profil mvn clean -Pwin64 sein?
sendon1982
14

Ich habe das Eigenschaften-Plugin verwendet, um dies zu lösen.

Eigenschaften werden im pom definiert und in eine my.properties-Datei geschrieben, auf die Sie dann über Ihren Java-Code zugreifen können.

In meinem Fall muss Testcode auf diese Eigenschaftendatei zugreifen, sodass die Eigenschaftendatei im pom in das testOutputDirectory von maven geschrieben wird:

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

Verwenden Sie outputDirectory, wenn Sie möchten, dass Ihr App-Code auf Eigenschaften zugreifen kann:

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

Für diejenigen, die nach einem ausführlicheren Beispiel suchen (ich musste ein wenig herumspielen, um dies zum Laufen zu bringen, da ich nicht verstand, wie sich die Benennung von Eigenschaften-Tags auf die Fähigkeit auswirkt, sie an anderer Stelle in der POM-Datei abzurufen), sieht mein POM wie folgt aus:

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

Und in der Kommandozeile:

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

Auf diese Eigenschaften kann also über den Java-Code zugegriffen werden:

 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");
Wackeln
quelle
Meine Eigenschaftendatei in Java gibt den gleichen Wert wie $ {app.env} aus. Sie wählt ihn nicht über die Maven-Befehlszeile aus. Sollte der Name der Eigenschaft dem Wert wie diesem entsprechen? <app.env> $ {app.env} </ app.env>
Sujith
6

Sie können Variablennamen als Projektdateien angeben. Geben Sie beispielsweise in Ihrer Plugin-Konfiguration nur ein Tag wie folgt an: -

<projectFile>${projectName}</projectFile>

Dann können Sie in der Befehlszeile den Projektnamen als Parameter übergeben: -

mvn [your-command] -DprojectName=[name of project]
Hariom Tomar
quelle
Ich möchte den Browsernamen und die Umgebung im Befehl mvn angeben. Wenn ich nicht zur Verfügung stelle, wird Standard ausgewählt. Wie geht das?
Paul
1
mvn clean package -DpropEnv=PROD

Verwenden Sie dann wie folgt in POM.xml

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