2009-08-26 34 views
15

Tôi đang viết một plugin maven có tham số là Chuỗi [].Chuỗi mảng làm đối số dòng lệnh cho plugin maven

Như thế này:

/** 
* @parameter expression="${args}" 
*/ 
protected String[] args; 

này có thể được sử dụng thông qua các POM như thế này:

<args> 
    <arg>arg1</arg> 
    <arg>arg2</arg> 
<args> 

Nhưng tôi muốn gửi nó vào từ dòng lệnh

-Dargs={arg1, arg2} 

Is điều này có thể?

Trả lời

9

Bạn không thể làm điều đó trực tiếp theo như tôi biết, nhưng thực tế là khá phổ biến để chấp nhận một chuỗi được phân tách và chia thành một mảng.

Ví dụ: maven-site-plugin cho phép bạn chỉ định Chuỗi địa phương được phân cách bằng dấu phẩy, trong khi maven-scala-plugin xử lý việc này bằng cách cho phép bạn xác định các đối số bằng dấu tách đường ống. Bạn có thể xem Mojos có liên quan để xem cách đối số được xử lý.

Một số ví dụ tập quán dưới đây:

trang web plugin:

-Dlocales=enGB,frFR 

scala-plugin:

-DaddArgs=arg1|arg2|arg3 

Cập nhật: nếu bạn muốn xử lý này thanh lịch hơn, bạn có thể sử dụng maven -shared-io để cho phép định nghĩa tệp mô tả bên ngoài, sau đó chuyển vị trí mô tả làm thuộc tính. Điều này có nghĩa là một đối số dòng lệnh có thể tham chiếu cấu trúc của cấu hình.

Nếu điều này nghe có vẻ phù hợp với bạn, hãy xem answer mô tả cách sử dụng mô tả bên ngoài trong plugin thuộc tính hoặc answer tương tự như plugin xml-maven. Hoặc bạn có thể chỉ cần nhìn vào các plugin lắp ráp cho các ý tưởng.

+0

Đây cũng là kết luận của tôi, thật đáng buồn. – torbjornvatn

+0

Tôi đã thêm một số gợi ý cho một phương pháp thay thế có thể hữu ích, sử dụng chia sẻ-io với các tệp mô tả bên ngoài để chuyển một bộ cấu hình vào plugin với một tham số duy nhất. –

7

Maven mới nhất (3.0.3) nên làm việc với:

-DaddArgs = arg1, arg2, arg3

+0

Không làm việc cho tôi với maven 3.0.3 với một trong hai -Dgoal.addArgs = x, y, z hoặc -DaddArgs = x, y, z – dcompiled

+0

có cách nào cho loại "Bản đồ" không? – ctron

+0

@dcompiled Tôi không biết tại sao nó không hoạt động cho bạn, nhưng điều này không hiệu quả với tôi. Phiên bản 3.0.5 exec-maven-plugin -Dexec.arguments = arg1, arg2 – Pyrolistical

1

Theo Sonatype blog here, nếu bạn là một nhà phát triển plugin và

  1. sử dụng Maven 3
  2. và chú thích tham số plugin loại mảng/bộ sưu tập của bạn bằng cách sử dụng chú thích như:

    /** @parameter expression="${args}" */

Bằng cách này, các tham số plugin có thể được xử lý bằng Maven tự động và người sử dụng cắm có thể cung cấp các thông số mảng plugin/loại bộ sưu tập thông qua CLI bằng một dấu phẩy tách sở hữu hệ thống như mvn myplugin:mygoal -Dargs=a,b,c

0

Để cập nhật về câu trả lời @ nybon của một chút, có vẻ như

@Parameter(property="your.param") 
private List<String> yourParam; 

hoạt động, ít nhất khi sử dụng maven-plugin-annotations:3.5 trong Maven 3.5.0. Chạy với

-Dyour.param=val1,val2 

bộ danh sách.

0

Cách để chỉ định danh sách giá trị thông qua thuộc tính hệ thống, cho plugin phụ thuộc vào mức độ cập nhật của plugin.

Tuy nhiên, nếu bạn đang xử lý một plugin được triển khai thích hợp được cập nhật, thì cách chính xác chỉ định một mảng giá trị cho plugin là thông qua các chuỗi được phân tách bằng dấu phẩy.

Đây là một tài liệu tham khảo: http://blog.sonatype.com/2011/03/configuring-plugin-goals-in-maven-3/

Dưới đây là một trích dẫn từ các tài liệu tham khảo:

Đối với nhiều thông số plugin của nó là thỉnh thoảng thuận tiện để xác định giá trị của họ từ dòng lệnh thông qua thuộc tính hệ thống. Trong quá khứ, điều này được giới hạn trong các thông số của các loại đơn giản như Chuỗi hoặc Boolean. Phiên bản Maven mới nhất cuối cùng cho phép người dùng plugin định cấu hình các bộ sưu tập hoặc mảng từ dòng lệnh thông qua các chuỗi được phân cách bằng dấu phẩy. Ví dụ: tham số plugin như sau:

Đi xa hơn một chút, chúng ta có thể xem xét ví dụ cụ thể hơn. Hãy xem xét, plugin Wildfly maven. Plugin này có thuộc tính cấu hình không dùng nữa được gọi là: jvmArgs.

Điều này được dự kiến ​​sẽ được chuyển vào dưới dạng danh sách giá trị được phân tách bằng dấu cách. Như chúng ta đều biết, trong dòng lệnh, rối tung xung quanh với không gian không đáng yêu. Vì vậy, nếu chúng ta nhìn vào định nghĩa của paramter này trong mã mojo plugin, bạn sẽ tìm thấy một cái gì đó như thế này (ở đây đi một trích dẫn).

/** 
* A space delimited list of JVM arguments. 
* 
* @deprecated use {@link #javaOpts} 
*/ 
@Parameter(alias = "jvm-args", property = PropertyNames.JVM_ARGS) 
@Deprecated 
private String jvmArgs; 

Vì vậy, đây là cách làm cũ.

Bây giờ, nếu bạn đang sử dụng phiên bản mới nhất của plugin này (ví dụ: Alpha6). Sau đó, mã nguồn sẽ có một trường mới đẹp được gọi là javaOpts. Hãy để chúng tôi xem xét trường này trông như thế nào trong mã.

/** 
* The JVM options to use. 
*/ 
@Parameter(alias = "java-opts", property = PropertyNames.JAVA_OPTS) 
private String[] javaOpts; 

Vì vậy, điều chúng tôi thấy là chúng tôi có trường mảng đẹp trong StartMojo. Trường mảng này được chú thích đúng cách. Và động cơ maven sẽ thực hiện việc nâng các giá trị vào Mojo.

Khi bạn muốn để bơm dữ liệu vào lĩnh vực này thông qua dòng lệnh, bạn sẽ trong bạn tập tin thực thi chỉ định một cái gì đó có dạng:

-Dwildfly.javaOpts="-Xmx1536M,-Xms1536M,-XX:MaxMetaspaceSize=512M,-XX:-HeapDumpOnOutOfMemoryError" 

Nếu bạn thử samething sử dụng sapces thay vì commans. Tôi sẽ cho bạn biết điều gì sẽ xảy ra:

[INFO] Máy chủ STANDALONE đang khởi động. Kích thước không hợp lệ tối đa đống: -Xmx1536M -XX: MaxMetaspaceSize = 512M -XX: -HeapDumpOnOutOfMemoryError

Vì vậy, bạn thấy đấy, maven khi nó với nuốt sở hữu hệ thống của tôi đầy những khoảng trống đó không làm một tách chuỗi. Vì vậy, Wildfly đã cố gắng thiết lập các thiết lập bộ nhớ jvm như thể bộ nhớ tối đa là chuỗi đầy đủ đó. Mặt khác, khi tôi sử dụng dấu phẩy để tách nó, Mojo được làm phong phú và tôi có thể kiểm soát cài đặt bộ nhớ của máy chủ ứng dụng khi khởi động.

Và tất nhiên, bạn muốn sử dụng thuộc tính hệ thống chứ không phải cấu hình XML pom.xml, cho các tác vụ như thiết lập công việc Jenkins. Với các thuộc tính hệ thống, bạn khá linh hoạt hơn.

Đó là nó.

Các vấn đề liên quan