2012-08-17 26 views
13

Trong maven nó là rất dễ dàng để thiết lập các thuộc tính trong một pom với cú pháp như sau:Trong Maven, làm cách nào tôi có thể xây dựng động một giá trị thuộc tính khi chạy?

... 
<properties> 
    <myValue>4.06.17.6</myValue> 
</properties> 
... 

Bây giờ tôi cần phải xây dựng một tài sản mà phụ thuộc vào phiên bản của pom của tôi. Để tạo tài sản tôi muốn làm như sau (mã giả java):

String[] parts = version.split("\\."); 
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]); 
// example: 4.06.17.6 => V_4_06_17_P6 

Nó phải là năng động, bởi vì nó được sử dụng như một tên thẻ trong kho lưu trữ của chúng tôi và phải luôn luôn được đồng bộ với các phiên bản của tạo tác.

Bất kỳ ý tưởng nào về cách tạo thuộc tính "động" đó?

Trả lời

25

Build-Helper Maven Plugin Mojo có thể giúp bạn ra khỏi đây.

Có một số mục tiêu có thể được sử dụng để giúp biến đổi thuộc tính.

lẽ regex-property là một trong những bạn muốn, nhưng nếu bạn v số ersion phù hợp với "tiêu chuẩn" hai người kia có thể cứu bạn.

Để sử dụng mục tiêu regex-property bạn sẽ làm điều gì đó như

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>tag.version</name> 
       <value>${project.version}</value> 
       <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex> 
       <replacement>V$1_$2_$3_P$4</replacement> 
       <failIfNoMatch>true</failIfNoMatch> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 

Lưu ý: regex của tôi có thể là hơi off vì vậy bạn nên kiểm tra trên.

Lưu ý: Giá trị thuộc tính sẽ chỉ khả dụng cho các lần thực thi sau giai đoạn mà việc thực thi này bị ràng buộc. Giai đoạn mặc định mà nó bị ràng buộc là validate nhưng nếu bạn đang sử dụng vòng đời khác (ví dụ: vòng đời của trang web) thì giá trị sẽ không có sẵn.

+0

Và nếu tôi không ràng buộc plugin vào một giai đoạn. Tôi đang sử dụng plugin phát hành maven và gọi bản phát hành mục tiêu: chuẩn bị. Làm thế nào để làm cho nó có sẵn ở đây? – EhmKah

+0

nếu bạn không chỉ định một pha, theo mặc định nó được ràng buộc với giai đoạn 'validate', do đó đoạn mã trên sẽ thực hiện mục tiêu khi giai đoạn xác thực đang hoạt động. khi bạn gọi trực tiếp mục tiêu, ví dụ: 'phát hành: chuẩn bị', những gì xảy ra là maven chạy mục tiêu trực tiếp bỏ qua bất kỳ giai đoạn vòng đời nào, vì vậy bản thân' release: prepar' sẽ không thấy thuộc tính * nhưng * vòng đời * được chia nhỏ * bằng 'release: prepare' sẽ thấy nó. Vì vậy, 'phát hành: chuẩn bị' sẽ không thể sử dụng thuộc tính để gắn thẻ SCM, nhưng thuộc tính sẽ có mặt trong phiên bản được chia rẽ mà plugin phát hành chạy –

+1

Nếu bạn muốn có thẻ SCM dựa trên thuộc tính (bạn nên cập nhật câu hỏi của bạn để phản ánh rằng đây là mục tiêu của bạn, hoặc bắt đầu một câu hỏi thứ hai) sau đó bạn có thể cần phải sử dụng một cái gì đó như http://maven.apache.org/plugins/maven-release-plugin/prepare-mojo.html#tagNameFormat mặc dù mà sẽ không cung cấp cho bạn '_' thay thế bạn muốn cũng không phải là' _P' tiêm. Tôi khuyên bạn nên thay đổi các yêu cầu về tên thẻ thay vì cố gắng bẻ cong Maven ;-) –

2

Bạn có thể sử dụng plugin xây dựng trình trợ giúp maven, cụ thể là regex-property mojo. Hãy xem usage examples (cuộn đến Đặt thuộc tính bằng cách áp dụng thay thế regex cho giá trị phần).

Về cơ bản bạn muốn một cái gì đó như thế trong pom của bạn để có được tài sản myVersionTag suy ra từ myValue:

<project> 
    ... 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>regex-property</id> 
      <goals> 
       <goal>regex-property</goal> 
      </goals> 
      <configuration> 
       <name>myVersionTag</name> 
       <value>$\{myValue}</value> 
       <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex> 
       <replacement>V_$1_$2_$3_P$4</replacement> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
    ... 
</project> 
+0

Tôi cũng đã đánh dấu câu trả lời này là được chấp nhận vì nó giống như câu trả lời ở trên. Cảm ơn bạn. – EhmKah

+1

Không hoàn toàn. Ví dụ của Ihor đặt '\' giữa '$' và '{' trong phần tử . Đây là cách mà tài liệu của Codehaus nói để làm điều đó nhưng nó sai. Mục tiêu regex-property sẽ không hoạt động với dấu gạch chéo ngược và không hoạt động nếu không có nó. Và Codehaus không hoạt động. –

+0

@SteveCohen Nếu tài liệu sai, hãy mở một vấn đề https://github.com/mojohaus/build-helper-maven-plugin/issues – khmarbaise

2

Câu trả lời của Ihor Kaharlichenko về cơ bản là chính xác ngoại trừ việc nó sao chép lỗi từ số Codehaus documentation. Không nên có '\' giữa '$' và '{'. Mojo hoạt động mà không có nó và không hoạt động với nó. Thật vậy, với một sự hiểu biết cơ bản về regex và Maven, tôi không thể nhìn thấy những gì các dấu gạch chéo ngược được cho là phải làm và thực sự nó là sai.

Câu trả lời của Stephen Connolly bỏ qua chính xác dấu gạch chéo ngược. Hãy cẩn thận.
Lỗi này đã tăng lên nhanh chóng trong toàn bộ SO và với việc Codehaus không hoạt động kinh doanh có thể sẽ không bao giờ được khắc phục.

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