Mavenに関する実行可能性に関する質問です。特に、集約pomでプロパティを定義し、それらを参照されるモジュールに挿入して、そのモジュールが継承階層で定義されたデフォルトのプロパティをローカルで上書きできるかどうかについて。
詳細に興味がある場合は、セットアップについて説明します。ただし、その前に、プロジェクトの構造についてチームとして幅広く話し合い、ニーズに非常によく適合していることをお伝えしておきます。現時点では、他の構造に関する提案を探しているわけではありませんが、Mavenが私たちのニーズを満たすことができるかどうかだけを調査しています。
だから、私たちのセットアップ。私はそれを本質に要約します。AとBの2つのソースプロジェクトがあります。これらはそれぞれ、実際にはそれぞれParentAとParentBの子モジュールです。ParentAとParentBには技術的には多数の子モジュールがありますが、この例では、簡単にするためにそれぞれを明示的に参照します。ここまでは順調ですね。ParentAはAをサブモジュールとして参照し、AはParentAをその親として参照します。同じ関係がBとParentBにも当てはまります。
今、楽しみが来ます。ParentAとParentBの両方のスーパー親pomが、dependencyManagementやプラグインなどの共有プロパティと構成を継承するようにします。ただし、このスーパー親pomがビルドを担当することは望ましくありません。代わりに、さまざまなモジュールを選択的にビルドするいくつかのビルドプロジェクトを定義したいと思います。この例では、BuildABとBuildBを紹介します。最初のビルドはA、次にBをビルドしますが、2番目のビルドはBだけです。実際には、これらのインターリーブモジュールグループと依存関係がかなりあります。最後に、全体像を完成させるために、BからAへの依存関係があります。
アスキーアートを使ってこれを描いてみましょう;)
継承
A --> ParentA --> parent
B --> ParentB --> parent
サブモジュールの関係
BuildAB ==> { (ParentA ==> A) (ParentB ==> B) }
BuildB ==> (ParentB ==> B)
依存関係
B > A
現在、BuildABファイルとBuildBファイルのプロパティを使用して依存関係を定義することは不可能です。これらのビルドファイルは継承ツリーの一部ではないため、プロパティを取得するものはありません。ただし、BuildABとBuildBを実行する場合は、依存関係のバージョンを異なる方法で制御する必要があります。依存関係をスーパーペアレントに配置するだけでは、要件に合わせて依存関係を削減することはできません。
なぜこれが考えられるのか疑問に思っている場合は、1つのチームがBモジュールを開発しており、Aにも小さな変更を加えている可能性があります。他の開発者は、依存関係のおかげでBに影響を与えるプロジェクトAの最新かつ最高のものに取り組んでいる可能性があります。Mercurialのおかげで、これをソースコードで処理するための優れたメカニズムがあります。しかし、Mavenでこれを機能させるのに本当に苦労しています。
理想的には、各ビルドファイルは、最初に親から継承するサブモジュールに依存します。ただし、この継承をオーバーライドする必要がある場合は、ビルドファイルで注入可能なプロパティを指定できるようにします。これは、モジュールで最初に指定された場合とまったく同じように機能します。もちろん、ソース制御されているpomを実際に変更することなくすべて。
評価したいのは、プラグインまたはパッチを介して、これを行うためにMavenを変更する余地があるかどうかです。
私たちはこれまでプラグインを書いたことがありません(そして率直に言って、これに関するチュートリアルやオンラインのものは乏しく、実際には開発者に優しいものではありません-誰かが私が見逃した良いチュートリアルを持っていない限り:))それは実行可能のようです。
だから基本的に、
- 以前に同様の要件を自分で処理し、既存のプラグインで機能させたことはありますか?
- 私たちが見逃している簡単なトリックはありますか?
- 同様のプラグインを作成し、開始する場所を推奨できますか?
- そのようなプラグインが機能しない可能性がある実際的な理由を知っていますか?
- Mavenのソースコードに取り組んでいて、結果のコードを提供できるかどうかを知っていますか...そして、必要に応じてどこから始めればよいのでしょうか。
最後のコメント。私たちはEclipseで開発しているので、プロパティを挿入せずに動作するビルドも必要です。これは通常の継承ツリーを介して行われると思います。
どうもありがとうございました。少し難しい質問だと思います。