7

現在、メインのビルドプロセスをantからmavenに変換しています。継続的インテグレーションサーバー(CI)にはTeamCityを使用しています。

CIサーバーを使用して、1.0.0.build#のように、バージョンにビルド番号が含まれている(毎晩の)ビルドを開始します。これらのビルドは、他のプロジェクトで使用するためにローカルのMavenリポジトリにインストールされます。したがって、CIサーバーがバージョンを管理し、Mavenがプロジェクトをビルドし、Mavenリポジトリがビルドを他のプロジェクトからアクセスできるようにします。

次のコマンドを使用して、CIサーバーからビルドを開始するつもりでした。

mvn -Dversion=1.0.0.25 install

プロジェクトのpomには偽のバージョン番号があり、次のように-Dフラグがそれをオーバーライドします。

<version>0.0.0.0</version>

この方法の問題は、mavenインストールプラグインがコマンドラインで渡されたバージョンではなく、pomファイル内のバージョンのみを使用することです。これは、このMavenの問題に記載されています。

したがって、この問題は2006年8月以降に存在し、修正されていないため、これは「MavenWay」ではないと思います。だから私の質問は、継続的インテグレーションの状況でMavenを使用して、バージョン管理されたアーティファクトをリポジトリにインストールするにはどうすればよいですか?

4

3 に答える 3

6

一意のバージョンで SNAPSHOT バージョンを構築したいようです。

したがって、POM でバージョンを次のように宣言します。

<version>#.#.#-SNAPSHOT</version>

次に、POM のdistributionManagementセクションで、 snapshotRepositoryの一意のバージョンを有効にします(これについては、Maven のPOM リファレンスを参照してください)。

<snapshotRepository>
  <uniqueVersion>true</uniqueVersion>
  <id>your-snapshot-repo-id</id>
  <name>Your Snapshots</name>
  <url>http://your-snapshot-repo-url/maven</url>
</snapshotRepository>

参考までに、Maven の規則では、バージョンを major.minor.revision として宣言することを推奨しています。したがって、1.0.0.25 ではなく 1.0.25 です。このバージョニング スキームを使用できる場合、Maven の世界で物事がよりスムーズに機能します。

于 2008-12-03T02:30:01.013 に答える
5

マシューの答えは、アーティファクトが目的のバージョン番号を持つローカルおよびリモートリポジトリにアップロードされるソリューションを提供します。つまり、リポジトリ内のパスには正しいバージョン番号が含まれていますが、Maven は常にソース POM ファイルをインストールしてデプロイします。${ciVersion}バージョン要素内。

次のような共通の親を持つマルチモジュールがある場合:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>myParent</artifactId>
    <groupId>com.stackoverflow</groupId>
    <version>${ciVersion}</version>
  </parent>
  <artifactId>myChild</artifactId>
  ...
</project>

依存関係の解決が存在し、 version のモジュールがmyChild見つからないというエラーが発生するため、モジュールの専用バージョンを参照することはできません。myParent${ciVersion}

ただし、POM 内のすべての変数が実際の値に置き換えられるローカルおよびリモート リポジトリに POM をアップロードする resolve-pom-maven-pluginを使用できます。これを行うには、次のスニペットを (親) POM に追加する必要があります。

...
<build>
  <plugins>
    <plugin>
      <groupId>com.sap.prd.mobile.ios.maven.plugins</groupId>
      <artifactId>resolve-pom-maven-plugin</artifactId>
      <version>1.0</version>
      <executions>
        <execution>
          <id>resolve-pom-props</id>
          <goals>
            <goal>resolve-pom-props</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
...
于 2012-09-07T06:18:57.780 に答える
4

シェクの答えはおそらく「メイブンな方法」なので、正解として受け入れます。ただし、慣例を変更する準備ができていないため、使用している回避策を次に示します。

間接的なレベルを使用することで、ビルド時にバージョン番号を pom に渡し、プラグインのインストールとデプロイでそれらを使用することができます。例えば:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow</groupId>
  <artifactId>stackoverflow</artifactId>
  <version>${ciVersion}</version>
  <packaging>jar</packaging>
  <name>StackOverflow</name>

  <properties>
    <ciVersion>0.0.0.0</ciVersion>
  </properties>

  ...

</project>

${project.version} を直接オーバーライドすることはできません。その代わりに、'ciVersion' という 2 番目のプロパティを追加し、プロパティ セクションでデフォルト値の '0.0.0.0' を指定します。CI サーバーは、コマンド ラインで ciVersion プロパティをオーバーライドすることにより、バージョン番号を指定できるようになりました。次のように:

mvn -DciVersion=1.0.0.25 install

install および deploy プラグインは、期待どおり、${project.version} が参照されるたびに渡された ciVersion プロパティの値を使用し、コマンド ラインでバージョンが指定されていない場合はデフォルト値が使用されます。これにより、プロセスへの影響を最小限に抑えて Maven に切り替えることができます。さらに、この回避策は目立たないため、必要に応じて SNAPSHOT 機能に簡単に切り替えることができます。

于 2008-12-08T20:57:13.893 に答える