7

相互に依存するいくつかのプロジェクトの展開パイプラインを構築しています。各ビルドは、Maven リポジトリにデプロイされる一意のバージョン番号を持つ新しいリリース ビルドを生成します。パイプラインの下流プロジェクトは、その新しいバージョンを依存関係としてトリガーされ、同様の方法でビルドされます。

プロジェクトをビルドする前に、pom.xml (またはマルチ モジュール プロジェクト内のすべての pom) のプロパティ値を変更する必要があります。たとえば、次のコードでは、「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 など) を作成する必要があります。

4

5 に答える 5

3

maven-replacer-pluginはい、これが可能なが存在します。

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

于 2013-03-02T17:26:07.173 に答える
3

利用可能な 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
}
于 2013-03-15T11:05:20.733 に答える
1

同様の要件がありました。/project/properties ノードの下のプロパティを更新するだけでなく、/project/profiles/properties ノードの下のプロパティも更新する必要があるため、両方のケースの更新をサポートするように Esko のスクリプトを変更します。一方、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
}
于 2013-11-14T08:34:06.450 に答える
1

これを試してみましたか?

バージョン Maven プラグイン

于 2013-03-02T14:26:26.853 に答える