2013-02-21 6 views
11

Tôi có một dự án được cấu hình để xây dựng và chạy với Maven. Dự án phụ thuộc vào các thư viện gốc cụ thể trên nền tảng và tôi đang sử dụng chiến lược tìm thấy here để quản lý các phụ thuộc đó.Sử dụng lệnh Maven 'exec: exec' với Arguments

Về cơ bản, các tệp .dll hoặc .so cho một nền tảng cụ thể được đóng gói vào một bình và được đẩy tới máy chủ Maven với trình phân loại xác định nền tảng đích. Plugin maven-dependency-plugin sau đó mở gói jar cụ thể của nền tảng và sao chép các thư viện gốc vào thư mục đích.

Thông thường tôi sẽ sử dụng mvn exec:java để chạy chương trình Java, nhưng exec:java chạy các ứng dụng trong cùng một JVM như Maven, điều này ngăn cản tôi sửa đổi đường dẫn lớp. Vì phụ thuộc gốc phải được thêm vào đường dẫn lớp, nên tôi buộc phải sử dụng mvn exec:exec thay thế. Đây là đoạn mã có liên quan của pom:

... 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <configuration> 
     <executable>java</executable> 
     <arguments> 
      <argument>-Djava.library.path=target/lib</argument> 
      <argument>-classpath</argument> 
      <classpath /> 
      <argument>com.example.app.MainClass</argument> 
     </arguments> 
    </configuration> 
</plugin> 
... 

Điều này phù hợp với cấu hình mặc định của ứng dụng, nhưng tôi muốn có thể chỉ định một số tham số tùy chọn tại dòng lệnh. Lý tưởng nhất, tôi muốn làm một cái gì đó như thế này:

mvn exec:exec -Dexec.args="-a <an argument> -b <another argument>" 

Thật không may, xác định biến exec.args ghi đè các đối số tôi có trong pom (mà được yêu cầu phải thiết lập classpath và chạy các ứng dụng). Có cách nào để giái quyết vấn đề này không? Cách tốt nhất để chỉ định một số đối số tùy chọn ở dòng lệnh mà không ghi đè những gì tôi có trong pom là gì?

Trả lời

34

Tôi đã tìm được giải pháp hợp lý cho vấn đề của mình bằng biến môi trường Maven.

Các giá trị mặc định được định nghĩa là thuộc tính trong pom, và thêm vào các plugin exec như các đối số:

... 
<properties> 
    <argumentA>defaultA</argumentA> 
    <argumentB>defaultB</argumentB> 
</properties> 
... 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <configuration> 
     <executable>java</executable> 
     <arguments> 
      <argument>-Djava.library.path=${project.build.directory}/lib</argument> 
      <argument>-classpath</argument> 
      <classpath /> 
      <argument>com.example.app.MainClass</argument> 
      <argument>-a</argument> 
      <argument>${argumentA}</argument> 
      <argument>-b</argument> 
      <argument>${argumentB}</argument> 
     </arguments> 
    </configuration> 
</plugin> 
... 

Bây giờ tôi có thể chạy với các thông số mặc định chính xác như tôi đã làm trước đây:

mvn exec:exec 

Và tôi có thể dễ dàng ghi đè các giá trị mặc định cho mỗi đối số tại dòng lệnh bằng cách sử dụng:

mvn exec:exec -DargumentA=alternateA -DargumentB=alternateB 
+2

Và cách thứ ese đối số có thể được truy cập trong mã Java, tôi có nghĩa là dòng này: 'String [] args'? – zygimantus

+2

@zygimantus bạn muốn 'mvn exec: java -Dexec.mainClass =" path.to.your.class "-Dexec.args =" arg1 arg2 "' nằm ngoài phạm vi của câu hỏi gốc. – dr0i