Truyền đối số dòng lệnh từ Maven dưới dạng thuộc tính trong pom.xml


97

Có thể truyền các đối số từ dòng lệnh đến các thuộc tính trong pom.xmltệp không? ví dụ tôi chạymvn ... argument

và trong pom.xml

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

Cảm ơn bạn vì sự giúp đỡ.


Không phải trực tiếp những gì bạn đang yêu cầu nhưng hồ sơ maven có thể hữu ích cho việc này
Sig

vâng, tôi biết về hồ sơ. Tôi đang sử dụng maven-soapui-plugin trong đó <projectFile> ... </projectFile> là tên được định nghĩa của dự án. Tôi có khoảng 10 dự án và tôi không muốn hồ sơ mới của mọi dự án. Tôi muốn sử dụng lập luận để chạy mvn ... project1 để chạy project1 và mvn ... project2 để chạy project2
hudi

Câu trả lời:


130

Đối với ví dụ về tài sản của bạn, hãy làm:

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

Lưu ý trích dẫn xung quanh toàn bộ định nghĩa thuộc tính. Bạn sẽ cần chúng nếu tài sản của bạn chứa khoảng trắng.


17
Cũng lưu ý rằng nếu bạn có cả thuộc tính trong pom và trên dòng lệnh, dòng lệnh sẽ được ưu tiên hơn. Điều này có thể hữu ích để cung cấp các giá trị mặc định có thể ghi đè.
dan carter

2
Chúng tôi cũng có thể chuyển nhiều đối số như thế này, đại loại như:mvn clean install "-Dprop1=value1" "-Dprop2=value2"
Sumit

14

Bên trong 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>

.....

Trong ví dụ này khi bạn chạy pom mà không có bất kỳ đối số nào thì mvn clean installcấu hình mặc định sẽ thực thi.

Khi thực hiện với mvn -Denv=win64 clean install

hồ sơ win64 sẽ được thực thi.

Vui lòng tham khảo http://maven.apache.org/guides/introduction/introduction-to-profiles.html


Vì sử dụng hồ sơ nào, nên mvn clean -Pwin64?
sendon1982

14

Tôi đã sử dụng plugin thuộc tính để giải quyết vấn đề này.

Các thuộc tính được xác định trong pom và được ghi ra tệp my.properties, nơi chúng có thể được truy cập từ mã Java của bạn.

Trong trường hợp của tôi, đó là mã kiểm tra cần truy cập tệp thuộc tính này, vì vậy trong pom, tệp thuộc tính được ghi vào testOutputDirectory của maven:

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

Sử dụng outputDirectory nếu bạn muốn các thuộc tính có thể truy cập được bằng mã ứng dụng của mình:

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

Đối với những người đang tìm kiếm một ví dụ đầy đủ hơn (tôi phải mất một chút thời gian để làm cho điều này hoạt động vì tôi không hiểu cách đặt tên của các thẻ thuộc tính ảnh hưởng đến khả năng truy xuất chúng ở nơi khác trong tệp pom), pom của tôi trông như sau:

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

Và trên dòng lệnh:

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

Vì vậy, các thuộc tính này có thể được truy cập từ mã 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");

Tệp thuộc tính của tôi trong java đang cung cấp cùng một giá trị với $ {app.env}. Nó không chọn nó từ dòng lệnh maven, tên thuộc tính có phải bằng giá trị như thế này không? <app.env> $ {app.env} </ app.env>
Sujith

6

Bạn có thể đặt tên biến dưới dạng tệp dự án. Ví dụ: trong cấu hình plugin của bạn chỉ cung cấp một thẻ như sau: -

<projectFile>${projectName}</projectFile>

Sau đó, trên dòng lệnh, bạn có thể chuyển tên dự án dưới dạng tham số: -

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

Tôi muốn cung cấp tên trình duyệt và môi trường trong lệnh mvn. Nếu tôi không cung cấp, nó sẽ chọn mặc định. Làm thế nào để làm điều đó?
paul

1
mvn clean package -DpropEnv=PROD

Sau đó, sử dụng như thế này trong POM.xml

<properties>
    <myproperty>${propEnv}</myproperty>
</properties>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.