2013-03-02 30 views
6

Tôi đang xây dựng một đường ống triển khai cho một vài dự án phụ thuộc vào nhau. Mỗi công trình xây dựng một bản phát hành mới xây dựng với một số phiên bản duy nhất, được triển khai đến một kho lưu trữ Maven. Các dự án hạ lưu trong đường ống sau đó được kích hoạt với phiên bản mới đó là một sự phụ thuộc và được xây dựng theo cách như vậy.Thay đổi Maven pom.xml <properties> giá trị vật lý

Điều tôi cần là thay đổi giá trị thuộc tính trong tệp pom.xml (hoặc tất cả poms trong dự án đa mô-đun) trước khi tạo dự án. Ví dụ trong mã sau "0.1.200" sẽ được thay đổi thành "0.1.345" (hoặc bất kỳ số bản dựng mới nhất nào). Việc sử dụng các thuộc tính hệ thống không phải là một tùy chọn, vì pom được cập nhật sẽ được triển khai trong một kho lưu trữ Maven, do đó thay đổi phải được lưu giữ lâu dài.

<properties> 
    <foo.version>0.1.200</foo.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>foo</artifactId> 
     <version>${foo.version}</version> 
    </dependency> 
</dependencies> 

Có một số plugin Maven để làm điều này với một lệnh dòng lệnh không? Khác, tôi sẽ cần viết một tập lệnh ngắn (ví dụ: trong Ruby) để phân tích cú pháp và thay đổi tất cả các tệp pom.xml trong dự án.

Trả lời

1

Bạn đã thử cái này chưa?

Version Maven Plugin

+2

Plugin đó có hoạt động để tự động cập nhật phụ thuộc vào phiên bản mới nhất của chúng, nhưng tôi không nhận thấy có cách cập nhật một thuộc tính cho một giá trị được chỉ định. –

+2

[Phiên bản-maven-plugin] (http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html) có khả năng xử lý các thuộc tính như vậy. Hãy xem các tài liệu. – khmarbaise

+2

Sự cố với các phiên bản: thuộc tính cập nhật là nó tự động cố gắng phát hiện phiên bản mới nhất là gì. Trong một đường ống triển khai không tốt, bởi vì nó có thể vô tình khiến Maven tìm một phiên bản quá cũ hoặc mới. Để tránh các bản dựng không thể lặp lại, tôi yêu cầu người dùng phải biết phiên bản nào cần sử dụng. –

3

Có, có tồn tại một maven-replacer-plugin có khả năng này.

Nhưng nếu bạn đang sử dụng một số công cụ CI (có vẻ như bạn đang có) bạn cũng có thể chỉ cần gắn bó với một kịch bản tùy chỉnh cho mục đích này.

2

Các plugin Maven có sẵn không phù hợp với mục đích của tôi, vì vậy tôi đã kết thúc viết kịch bản của Ruby sau đó thực hiện chính xác những gì tôi cần:

#!/usr/bin/env ruby 
require 'rexml/document' 

def change_property(pom, key, value) 
    property = pom.elements["/project/properties/#{key}"] 
    if property != nil 
    puts " #{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

unless ARGV.length == 2 
    puts "Usage: #{$0} KEY VALUE" 
    exit 1 
end 
KEY = ARGV.shift 
VALUE = ARGV.shift 

Dir.glob("**/pom.xml") { |pom_path| 
    puts pom_path 

    pom = REXML::Document.new(File.new(pom_path)) 
    pom.context[:attribute_quote] = :quote 
    change_property(pom, KEY, VALUE) 

    File.open(pom_path, 'wb') { |file| 
    pom.write(file) 
    } 
    puts 
} 
1

Tôi đã có một yêu cầu tương tự. Bên cạnh việc cập nhật thuộc tính trong nút/project/properties, tôi cũng cần cập nhật thuộc tính trong/project/profiles/properties node, vì vậy tôi sửa đổi kịch bản của Esko để hỗ trợ cập nhật cả hai trường hợp. Trong khi đó, nó cũng hỗ trợ cập nhật nhiều thuộc tính trong một lệnh, do đó bạn không phải chạy nó nhiều lần nếu bạn cần cập nhật nhiều thuộc tính trong cùng một tệp pom.xml.

#!/usr/bin/env ruby 
require 'rexml/document' 

def change_profile_property(pom, profile_id, key, value) 
    property = pom.elements["/project/profiles/profile[id='#{profile_id}']/properties/#{key}"] 
    if property != nil 
    puts " #{profile_id}-#{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

def change_property(pom, key, value) 
    property = pom.elements["/project/properties/#{key}"] 
    if property != nil 
    puts " #{key}: #{property.text} -> #{value}" 
    property.text = value 
    end 
end 

if ARGV.length == 0 
    puts "Usage: #{$0} KEY=VALUE [-profile <profile id>] KEY=VALUE" 
    exit 1 
end 

# parse the command line argument to get the key/value 
global_properties = Array.new 
profile_properties= Array.new 

profile = nil 
loop { case ARGV[0] 
    when '-profile' then ARGV.shift; profile=ARGV.shift 
    when nil then break 
    else 
    kv_str = ARGV.shift 
    if profile == nil 
     global_properties.push(kv_str) 
    else 
     profile_properties.push(kv_str) 
    end 
    end; 
} 

Dir.glob("**/pom.xml") { |pom_path| 
    puts pom_path 

    pom = REXML::Document.new(File.new(pom_path)) 
    pom.context[:attribute_quote] = :quote 

    # updating the global properties 
    if global_properties.length != 0 
    for kv in global_properties 
     kv_array = kv.split('=') 
     if kv_array.length == 2 
      change_property(pom, kv_array[0], kv_array[1]) 
     end 
    end 
    end 

    # updating the properties in profile 
    if profile_properties.length != 0 
    for kv in profile_properties 
     kv_array = kv.split('=') 
     if kv_array.length == 2 
     if profile != nil 
      change_profile_property(pom, profile, kv_array[0], kv_array[1]) 
     end 
    end 
    end 
    end 

    File.open(pom_path, 'wb') { |file| 
    pom.write(file) 
    } 
    puts 
} 
0

Flatten Maven Plugin có thể được sử dụng để cập nhật các biến. Hãy để tôi giải thích với một ví dụ.

<groupId>groupid</groupId> 
<artifactId>artifactid</artifactId> 
<version>${ServiceVersion}</version> 
<packaging>pom</packaging> 

<properties> 
    <foo.version>${ServiceVersion}</foo.version> 
</properties> 

Trong pom.xml, tôi đang sử dụng "ServiceVersion" để nhận giá trị trong khi tạo. Biến foo.version cũng sẽ được cập nhật trong quá trình xây dựng. Bây giờ, biến foo.version có thể được sử dụng trong bất kỳ phụ thuộc nào.

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>foo</artifactId> 
     <version>${foo.version}</version> 
    </dependency> 
</dependencies> 

Vì vậy, cuối cùng bao gồm các Flatten Maven Plugin trong pom.xml

<plugin> 
<groupId>org.codehaus.mojo</groupId> 
<artifactId>flatten-maven-plugin</artifactId> 
<version>1.0.0</version> 
<configuration> 
    <updatePomFile>true</updatePomFile> 
</configuration> 
<executions> 
    <execution> 
     <id>flatten</id> 
     <phase>process-resources</phase> 
     <goals> 
      <goal>flatten</goal> 
     </goals> 
    </execution> 
    <execution> 
     <id>flatten.clean</id> 
     <phase>clean</phase> 
     <goals> 
     <goal>clean</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Bây giờ cung cấp các phiên bản dịch vụ.

clean install -DServiceVersion=0.1.345 
Các vấn đề liên quan