2010-10-21 38 views
9

Tôi cần đặt thuộc tính trong tệp maven pom.xml phải là UUID. Ai có thể cho tôi biếtTạo UUID qua Maven

cách tốt nhất có thể để đặt thuộc tính thành UUID là gì?

Tôi đang sử dụng một hồ sơ mà khởi động gigaspaces và gigaspaces đòi hỏi tên nhóm mà tôi

muốn là duy nhất (uuid). Vì vậy, trong tiểu sử của tôi, tôi muốn đặt giá trị thuộc tính groupName mà

phải thay đổi cho mỗi bản dựng. Tôi đã viết một plugin UUIDGenerator bản thân mình như tôi đã không tìm thấy bất kỳ.

Vì vậy, tôi đang tìm kiếm Làm cách nào để đạt được điều này? Đang viết tùy chọn tốt hơn cho plugin hoặc có tùy chọn dễ dàng hơn là

.

Cảm ơn,

Shekhar

+0

Đã cho tôi như 3 giây để Google và tôi muốn cảm thấy bẩn nếu nó đã bỏ phiếu tán như một câu trả lời, nhưng đây là một cách tuyệt vời để làm điều đó: http://johannburkard.de/software/uuid/ –

+1

@David liên kết cho thấy cách thêm lib tạo UUID, nhưng tôi đoán OP cần đặt UUID thành chính pom. @Shekhar sửa tôi nếu tôi sai –

+0

Bạn đang cố gắng đạt được điều gì? Khoản vay mẫu là tải nó qua dòng lệnh: 'mvn build" -Dcommand.line.prop = hello lần nữa "' Và bạn sử dụng nó như 'line.prop = $ {command.line.prop}' – amra

Trả lời

7

Trước hết, nếu thiết lập của mình đòi hỏi phải có một cái gì đó gọi là "tên nhóm", có lẽ bạn nên cung cấp một giá trị có ý nghĩa. Nếu nó phải là duy nhất, bạn có thể thêm một số ký tự được tạo, như "MyApplication-10937410". Ngoài ra, sử dụng một UUID có vẻ như với tôi như sử dụng một cái búa-búa để crack một hạt. Nhưng điều này là độc lập với vấn đề thực tế của bạn, vì vậy đây là giải pháp mà tôi đề xuất:

Nếu bạn chưa làm như vậy, hãy tạo plugin maven (có nguyên mẫu cho điều đó). Thêm sự phụ thuộc này:

<dependency> 
     <groupId>org.apache.maven</groupId> 
     <artifactId>maven-project</artifactId> 
     <version>2.2.1</version> 
    </dependency> 

Đây là cách MOJO của bạn sẽ giống như thế:

/** 
* Goal which generates a group name. 
* 
* @goal generate 
* @phase initialize 
*/ 
public class GroupNameGeneratorMojo extends AbstractMojo { 

    /** 
    * @parameter expression="${project}" 
    * @required 
    * @readonly 
    */ 
    private MavenProject project; 

    @Override 
    public void execute() throws MojoExecutionException { 
     String groupName = ... ; 
     project.getProperties().setProperty("uniqueGroupName", groupName); 
    } 

} 

Trong các dự án thực tế của bạn pom, sử dụng ${uniqueGroupName} bất cứ nơi nào bạn cần nó và cấu hình plugin của bạn như thế này

<build> 
    <plugins> 
     <plugin> 
      <groupId>the.plugin.groupid</groupId> 
      <artifactId>groupNameGenerator</artifactId> 
      <executions> 
       <execution> 
        <goals><goal>generate</goal></goals> 
       </execution> 
      </executions> 
     <plugin> 
8

Arian's solution (thực hiện một plugin maven) là IMO một cách sạch sẽ để thực hiện yêu cầu của bạn (và 1 cho câu trả lời của mình).

Nhưng nếu bạn không có kế hoạch sử dụng lại plugin của mình ở một nơi khác, cách thay thế nhanh sẽ là hack pom bằng cách sử dụng GMavenPlus plugin. Dưới đây là một ví dụ cho thấy làm thế nào để làm như vậy sử dụng một lớp Java từ một thư viện để tạo ra một số uuid và thiết lập nó như là một tài sản:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q3984794</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>org.safehaus.jug</groupId> 
     <artifactId>jug</artifactId> 
     <version>2.0.0</version> 
     <!-- the classifer is important!! --> 
     <classifier>lgpl</classifier> 
     </dependency> 
    </dependencies> 
    </dependencyManagement> 
    <dependencies> 
    ... 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.gmaven</groupId> 
     <artifactId>gmaven-plugin</artifactId> 
     <version>1.3</version> 
     <executions> 
      <execution> 
      <id>set-custom-property</id> 
      <phase>initialize</phase> 
      <goals> 
       <goal>execute</goal> 
      </goals> 
      <configuration> 
       <classpath> 
       <element> 
        <groupId>org.safehaus.jug</groupId> 
        <artifactId>jug</artifactId> 
        <classifier>lgpl</classifier> 
       </element> 
       </classpath> 
       <source> 
       import org.safehaus.uuid.UUIDGenerator 
       def uuid = UUIDGenerator.getInstance().generateRandomBasedUUID() 
       project.properties.setProperty('groupName', uuid.toString()) 
       </source> 
      </configuration> 
      </execution> 
      <execution> 
      <id>show-custom-property</id> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>execute</goal> 
      </goals> 
      <configuration> 
       <source> 
       def props = project.properties 
       props.each {key, value -&gt; println key + "=" + value} 
       </source> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Chỉ cần ràng buộc plugin vào một giai đoạn trước khi những thứ gigaspaces.

Việc thực hiện thứ hai là chỉ có cho mục đích trình diễn (để hiển thị các thuộc tính):

 
$ mvn generate-resources 
[INFO] Scanning for projects... 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Q3984794 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- gmaven-plugin:1.3:execute (set-custom-property) @ Q3984794 --- 
[INFO] 
[INFO] --- gmaven-plugin:1.3:execute (show-custom-property) @ Q3984794 --- 
downloadSources=true 
downloadJavadocs=true 
project.reporting.outputEncoding=UTF-8 
project.build.sourceEncoding=UTF-8 
groupName=814ff1a5-a102-426e-875c-3c40bd85b737 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
...