ส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งจาก Maven เป็นคุณสมบัติใน pom.xml


101

เป็นไปได้ไหมที่จะส่งอาร์กิวเมนต์จากบรรทัดคำสั่งไปยังคุณสมบัติในpom.xmlไฟล์ ตัวอย่างเช่นฉันวิ่งmvn ... argument

และใน pom.xml

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

ขอบคุณสำหรับความช่วยเหลือ.


ไม่ใช่สิ่งที่คุณต้องการโดยตรง แต่โปรไฟล์ mavenอาจมีประโยชน์สำหรับสิ่งนี้
ซิก

ใช่ฉันรู้เกี่ยวกับโปรไฟล์ ฉันใช้ maven-soapui-plugin โดยที่ใน <projectFile> ... </projectFile> เป็นชื่อที่กำหนดของโปรเจ็กต์ ฉันมีโปรเจ็กต์ประมาณ 10 โปรเจ็กต์และฉันไม่ต้องการสร้างโปรไฟล์ใหม่ทุกโปรเจ็กต์ ฉันต้องการใช้อาร์กิวเมนต์เพื่อรัน mvn ... project1 เพื่อรัน project1 และ mvn ... project2 เพื่อรัน project2
hudi

คำตอบ:


135

สำหรับตัวอย่างคุณสมบัติของคุณทำ:

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

หมายเหตุคำพูดรอบนิยามคุณสมบัติทั้งหมด คุณจะต้องใช้หากคุณสมบัติของคุณมีช่องว่าง


19
โปรดทราบด้วยว่าหากคุณมีทั้งคุณสมบัติใน pom และบนบรรทัดคำสั่งบรรทัดคำสั่งจะมีความสำคัญ สิ่งนี้จะมีประโยชน์สำหรับการระบุค่าเริ่มต้นที่เขียนทับได้
dan carter

2
นอกจากนี้เรายังสามารถส่งผ่านข้อโต้แย้งต่างๆเช่นนี้ได้เช่น:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

15

ฉันใช้ปลั๊กอินคุณสมบัติเพื่อแก้ปัญหานี้

คุณสมบัติถูกกำหนดไว้ใน pom และเขียนลงในไฟล์ my.properties ซึ่งสามารถเข้าถึงได้จากโค้ด Java ของคุณ

ในกรณีของฉันมันเป็นรหัสทดสอบที่ต้องการเข้าถึงไฟล์คุณสมบัตินี้ดังนั้นใน pom ไฟล์คุณสมบัติจึงถูกเขียนลงใน 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

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


เนื่องจากใช้ profile ตัวไหนควร mvn clean -Pwin64?
sendon1982

6

คุณสามารถตั้งชื่อตัวแปรเป็นไฟล์โครงการ ตัวอย่างเช่นในการกำหนดค่าปลั๊กอินของคุณให้แท็กเดียวดังนี้: -

<projectFile>${projectName}</projectFile>

จากนั้นในบรรทัดคำสั่งคุณสามารถส่งชื่อโครงการเป็นพารามิเตอร์: -

mvn [your-command] -DprojectName=[name of project]

ฉันต้องการระบุชื่อเบราว์เซอร์และสภาพแวดล้อมในคำสั่ง mvn หากฉันไม่ระบุจะเลือกค่าเริ่มต้น ต้องทำอย่างไร?
พอล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.