2013-03-02 22 views
6

お互いに依存する2つのプロジェクトのデプロイメントパイプラインを構築しています。各ビルドは、独自のバージョン番号を持つ新しいリリースビルドを作成します。これは、Mavenリポジトリにデプロイされます。パイプラインの下流のプロジェクトは、その新しいバージョンを依存関係としてトリガされ、同様の方法で構築されます。Maven pom.xmlを物理的にの値に変更する

私が必要とするのは、プロジェクトをビルドする前にpom.xml(またはマルチモジュールプロジェクトのすべてのポム)のプロパティ値を変更することです。たとえば、次のコードでは、 "0.1.200"は "0.1.345"(または最新のビルド番号が何であれ)に変更されます。更新されたpomはMavenリポジトリにデプロイされるため、システムプロパティの使用はオプションではないため、変更は永続的でなければなりません。

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

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

1つのコマンドライン命令でこれを行うためのいくつかのMavenプラグインはありますか?それ以外のプロジェクトのすべてのpom.xmlファイルを解析して変更する短いスクリプト(例えばRuby)を書く必要があります。

答えて

1

これを試しましたか?

Version Maven Plugin

+2

このプラグインには、依存関係を最新のバージョンに自動的に更新する操作がありますが、単一のプロパティを指定した値に更新する方法はありませんでした。 –

+2

[versions-maven-plugin](http://mojo.codehaus.org/versions-maven-plugin/examples/update-properties.html)は、このようなプロパティを処理できます。ドキュメントを見てください。 – khmarbaise

+2

versions:update-propertiesの問題は、最新バージョンが何であるかを自動的に検出しようとすることです。誤ってMavenに古いバージョンや新しいバージョンが見つかる可能性があるため、デプロイメントパイプラインではうまくいきません。反復不可能なビルドを避けるために、私はどのバージョンを使うべきかを明確にする必要があります。 –

3

はい、このことが可能であるmaven-replacer-pluginが存在します。

しかし、CIツールを使用している場合(これは明らかにあなたです)、この目的のためにカスタムスクリプトを使用することもできます。

2

利用できるのMavenプラグインは私の目的に適合していなかったので、私は私が必要なものを正確に行い、以下のRubyスクリプト書いてしまった:

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

私は同様の要件を持っていたし。/project/propertiesノードの下のプロパティを更新するだけでなく、/ project/profiles/propertiesノードの下のプロパティも更新する必要があるため、Eskoのスクリプトを修正して両方のケースの更新をサポートします。一方、あるコマンドで複数のプロパティを更新することもできます。同じ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では、ビルド中に値を取得するために "ServiceVersion"を使用しています。 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 
関連する問題