2013-03-02 8 views
6

मूल्य मैं एक दूसरे पर निर्भर कुछ परियोजनाओं के लिए एक तैनाती पाइपलाइन का निर्माण कर रहा हूं। प्रत्येक बिल्ड एक अद्वितीय संस्करण संख्या के साथ एक नया रिलीज बिल्ड बनाता है, जिसे मैवेन रिपोजिटरी में तैनात किया जाता है। पाइपलाइन में डाउनस्ट्रीम परियोजनाएं तब उस नए संस्करण के साथ एक निर्भरता के रूप में ट्रिगर की जाती हैं और इस तरह से बनाई जाती हैं।बदलते मेवेन pom.xml <properties> भौतिक रूप से

मुझे परियोजना बनाने से पहले pom.xml (या बहु मॉड्यूल प्रोजेक्ट में सभी पोम्स) में एक संपत्ति मान बदलने के लिए क्या चाहिए। उदाहरण के लिए निम्नलिखित कोड में "0.1.200" को "0.1.345" में बदल दिया जाएगा (या जो भी नवीनतम बिल्ड नंबर है)। सिस्टम गुणों का उपयोग करना एक विकल्प नहीं है, क्योंकि अद्यतन पोम को मैवेन रिपोजिटरी में तैनात किया जाएगा, इसलिए परिवर्तन लगातार होना चाहिए।

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

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

वहाँ एक कमांड लाइन अनुदेश के साथ ऐसा करने के लिए कुछ Maven प्लगइन है? अन्यथा मुझे एक छोटी लिपि (उदा। रूबी में) लिखनी होगी जो परियोजना में सभी pom.xml फ़ाइलों को पार और बदल देती है।

उत्तर

1

क्या आपने इसे आजमाया था?

Version Maven Plugin

+2

उस प्लगइन में अपने नवीनतम संस्करणों पर निर्भरता को स्वचालित रूप से अपडेट करने के लिए संचालन हैं, लेकिन मैंने एक ही संपत्ति को निर्दिष्ट मूल्य पर अपडेट करने का कोई तरीका नहीं देखा। –

+2

[संस्करण-मेवेन-प्लगइन] (http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html) ऐसी संपत्तियों को संभालने में सक्षम है। दस्तावेज़ों में एक नज़र डालें। – khmarbaise

+2

संस्करणों के साथ समस्या: अद्यतन-गुण यह है कि यह स्वचालित रूप से यह पता लगाने का प्रयास करता है कि नवीनतम संस्करण क्या है। एक तैनाती पाइपलाइन में जो अच्छा नहीं है, क्योंकि यह गलती से मैवेन को बहुत पुराना या नया संस्करण ढूंढने का कारण बन सकता है। अपरिवर्तनीय बिल्डों से बचने के लिए, मुझे किस संस्करण का उपयोग करने के बारे में स्पष्टता की आवश्यकता है। –

3

हाँ, वहाँ एक maven-replacer-plugin जो इस में सक्षम है मौजूद है।

लेकिन यदि आप कुछ सीआई उपकरण (जो स्पष्ट रूप से आप हैं) का उपयोग कर रहे हैं तो आप इस उद्देश्य के लिए एक कस्टम स्क्रिप्ट के साथ रह सकते हैं।

2

उपलब्ध Maven प्लगइन्स मेरा उद्देश्य के अनुरूप नहीं थे, इसलिए मैं निम्नलिखित रूबी स्क्रिप्ट कि वास्तव में करता है कि मैं क्या जरूरत है लेखन समाप्त हो गया:

#!/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

मैं एक ऐसी ही आवश्यकता थी।/प्रोजेक्ट/प्रॉपर्टी नोड के तहत संपत्ति को अपडेट करने के अलावा, मुझे संपत्ति/प्रोजेक्ट/प्रोफाइल/प्रॉपर्टी नोड के तहत संपत्ति को अपडेट करने की भी आवश्यकता है, इसलिए मैं दोनों मामलों को अपडेट करने के लिए एस्को की स्क्रिप्ट को संशोधित करता हूं। इस बीच, यह एक कमांड में एकाधिक गुणों को अद्यतन करने का भी समर्थन करता है, इसलिए यदि आपको उसी 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 चर को अद्यतन करने के लिए उपयोग किया जा सकता है। मुझे एक उदाहरण के साथ समझाओ।

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

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

pom.xml में, मैं निर्माण के दौरान मूल्य प्राप्त करने के लिए "सेवावर्सन" का उपयोग कर रहा हूं। Foo.version वैरिएबल भी निर्माण के दौरान अद्यतन किया जाएगा। अब, foo.version चर किसी भी निर्भरता में उपयोग किया जा सकता है।

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

तो, अंत में 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> 

अब सेवा संस्करण प्रदान में समतल Maven प्लगइन शामिल हैं।

clean install -DServiceVersion=0.1.345 
संबंधित मुद्दे