flatten-maven-pluginを使用してMavenプロジェクトのバージョン管理を簡素化した経験

私達について



1Cでは、 1C: C ++およびJavaScriptの エンタープライズプラットフォームだけでなく、Javaアプリケーション、特にEclipseとメッセンジャープラットフォームと密接に統合されたサーバーである対話システムの新しい開発環境であるエンタープライズ開発ツールも開発しています



エントリー



ほとんどの場合、Javaアプリケーションをアセンブルするためのシステムとしてmavenを使用します。この短い記事では、開発プロセス中に対処しなければならない問題の1つと、この問題を克服するためのアプローチについて説明します。



背景とワークフロー



Mavenプロジェクトの開発の仕様により、多くのモジュール、依存関係、および子プロジェクトを使用します。 1つのツリー内のPOMファイルの数は、数十または数百にもなります。



画像



一見作成され、忘れられても大丈夫です。 すべてのファイルを一度に変更または追加する必要がある場合は、エディターとIDEに便利なツールがたくさんあります。 そして、pom.xmlの最も一般的な定期的な変更は何ですか? プロジェクトのバージョンと依存関係を変更すると信じています。 誰かがこれについて議論したいかもしれませんが、これは私たちの場合です。 その理由は、カーネルと共に、独自のライブラリの多くを同時に開発しており、アセンブリとテスト結果の一定の再現性のために、スナップショットの使用は便利なアプローチではないと思われるためです。 このため、各アセンブリでプロジェクトのバージョン番号を上げる必要があります。



また、開発者はときどきライブラリのブランチを収集し、すべての依存関係に対してパフォーマンスを確認する必要があります。すべての依存関係は、手動でバージョンを変更する必要があります。



初期決定



このような頻繁かつ複数のバージョン変更により、CIはプロセスを簡素化および自動化することを望んでいます。 ここでは、便利な有名なバージョン、maven-pluginプラグインが助けになります-プラグインして実行します



mvn -Nバージョン:set -DnewVersion = 2.0.1



そして、Mavenは必要に応じてすべてを実行します。階層を上から下に実行し、すべてのバージョンを置き換えます-美! プルリクエストを上げるのは今のままで、同僚は変更を監視し、トランクにすばやく参加できます。 早く? どんなに。 レビューごとに数百のpom.xmlがあり、それはコードをカウントしていません。 さらに、このような多数の変更されたファイルとのマージの競合に対して安全な人はいません。 CIプロセス中に、バージョンの変更は機能の変更とともに自動的に発生し、何らかの形で個別に発生するわけではないことに注意してください。



新機能



バージョン3.5.0-beta-1からMaven Apache Projectのメンバーがバージョン(プレースホルダー)のいわゆる「プレースホルダー」のサポートを開始するまで、しばらくの間、落ち着いて平和に暮らしました。 これらの代替の本質は、プロジェクトのバージョンを具体的に示す代わりに、変数$ {revision}$ {sha1}および$ {changelist}pom.xmlで使用されることです。 これらのプロパティ自体の値は、< プロパティ >要素で設定されるか、システムプロパティを介して定義できます



mvn -Drevision = 2.0.0クリーンパッケージ



システムプロパティ値は、< プロパティ >で定義された値よりも優先されます。





<プロジェクト>

<modelVersion> 4.0.0 </ modelVersion>

<親>

<groupId> org.apache </ groupId>

<artifactId> apache </ artifactId>

<バージョン> 18 </バージョン>

</ parent>

<groupId> org.apache.maven.ci </ groupId>

<artifactId> ci-parent </ artifactId>

<name>最初のCIフレンドリー</ name>

<version> $ {revision} $ {sha1} $ {changelist} </ version>

...

<プロパティ>

<revision> 1.3.1 </ revision>

< changelist > -SNAPSHOT </ changelist >

<sha1 />

</ properties>

</ project>



子孫

<プロジェクト>

<modelVersion> 4.0.0 </ modelVersion>

<親>

<groupId> org.apache.maven.ci </ groupId>

<artifactId> ci-parent </ artifactId>

<version> $ {revision} $ {sha1} $ {changelist} </ version>

</ parent>

<groupId> org.apache.maven.ci </ groupId>

<artifactId> ci-child </ artifactId>

...

</ project>





バージョン2.0.0-SNAPSHOTをビルドする場合は、次を使用します。



mvn -Drevision = 2.0.0クリーンパッケージ



リリースしたい場合は、スナップショットをゼロにするだけです



mvn -Dchangelist =クリーンパッケージ



*上記の例は、Maven Apache Project Webサイトの記事から引用したものです。



厳しい現実



すべてが健康で健康です。満足感を味わう時が来ましたが、そうではありません。 $ {revision}はリポジトリで公開されたアーティファクトの説明の値に置き換えられず、mavenはそれが何であるかを理解しないため、インストールとデプロイではこのメソッドは機能しません。



<親>

<groupId> org.apache </ groupId>

<artifactId> apache </ artifactId>

<version> $ {revision} </ version>

</ parent>





トンネルの終わりの光



問題の解決策を探さなければなりません。 この状況はflatten-maven-pluginによって保存できたかもしれません。 このプラグインはpomのすべての変数を許可しますが、同時に、アセンブリ中にのみ必要であり、公開されたアーティファクトを他のプロジェクトにインポートする場合には必要ない他の情報を大量に切り取ります。 また、プラグインはすべての親子の依存関係を「まっすぐに」し、その結果、必要なものがすべて含まれたフラットなPOMを取得します。 不便なのは、彼が「多すぎる」を切り過ぎたことで、それは私たちにはまったく合わなかった。 このプラグインの開発に関する情報を調べた結果、私たちだけが宇宙にいるわけではないことが判明し、2018年8月に、pom.xmlを「損なう」方法を独自に決定できるようにするために、プラグインリポジトリのgithubでプルリクエストが作成されました。 開発者は苦しんでいる人の声に耳を傾け、すでに12月に新しいバージョン1.1.0のリリースで、新しいresolveCiFriendliesOnlyモードがflatten-maven-pluginに登場しました。これは、これまでとは異なり、pom.xmlをそのままにして、 <version>要素を除き、 $を許可します{revision}$ {sha1}および$ {changelist}



プロジェクトにプラグインを追加する



<プラグイン>

<プラグイン>

<groupId> org.codehaus.mojo </ groupId>

<artifactId> flatten-maven-plugin </ artifactId>

<バージョン> 1.1.0 </バージョン>

<構成>

<updatePomFile> true </ updatePomFile>

<flattenMode> resolveCiFriendliesOnly </ flattenMode>

</構成>

<実行>

<実行>

<id>平坦化</ id>

<phase>プロセスリソース</ phase>

<目標>

<goal>平坦化</ goal>

</ goals>

</実行>

<実行>

<id> flatten.clean </ id>

<phase> clean </ phase>

<目標>

<goal> clean </ goal>

</ goals>

</実行>

</ executions>

</ plugin>

</ plugins>





できた!



ハッピーエンド



これからは、プロジェクト全体のバージョンを変更し、すべての依存関係にそれを知らせるために、ただ1つのルートpom.xmlで< revision >要素を編集する必要があります。 レビューに反映されるのと同じ変更が加えられたこれらのファイルは100つか2つではなく、1つです。 さて、 versions-maven-pluginを使用する必要はありません。



All Articles