依存関係の共有に関するMavenマルチモジュールプロジェクトの構成
-
27-10-2019 - |
質問
いくつかの同様の質問がありますが、このようなものはありません。この状況にどのように対処しますか(典型的なシナリオ):
親アーティファクト/プロジェクトを持つ8〜11の児童プロジェクトのプロジェクトと、他のプロジェクトを主にモジュールとして使用/宣言する1つの主要なプロジェクトを持っています。
問題は、すべてのプロジェクトが「厳密に」共通の依存関係のみを共有することです。 testng, logging, apache commons and stuff
. 。しかし、いつも好きです そのうち3人は、同じ特定のDEPの50〜60%(Apache-Chemistry、JackRabbit、Abderaなど)を使用し、そのうち2〜3個も同じであるが異なる依存関係の50〜60%を使用しています。そして、主なものは同じDepsの多くを使用しています。
他の人がそれらを継承するために、それらを「非厳格に」共有したDEPSを親プロジェクトに入れることはできません。したがって、一般的なDEPのみが継承されます。そして、重複する依存関係がたくさんあります。そして、私は彼らのバージョンのみを介して管理することができます <dependencyManagement>
.
別のオプションは、親POMにほとんどの依存関係を含めることですが、子どものプロジェクトは必要ないものでも継承します。
私は複数の親プロジェクトを持つことができましたが、それは正しいとは感じません。また、親POMの定義を適切に文書化/コメントしない場合、プロジェクトが必要とする依存関係がわからないため、親プロジェクトからの継承は悪夢になる可能性があります。
もう1つの方法は、依存関係コンテナとしてのみ機能するPOMアーティファクトを作成することです。依存関係の特定のグループを宣言しているため、モジュールは推移的な依存関係を獲得するように宣言します。でもねえ、展開してコミットしたいですか
oneDePartifact宣言 jackrabit, abdera, chemistry
別のdepartifact宣言 htmlcleaner, google-api, tika
ThirdDepartifact宣言 spring, httpclient, selenium
それは大きな混乱です、私が使うかどうかはわかりません <dependencyManagement>
正しく、依存関係バージョンの管理にのみ役立つようです。
アプリの開発を「Maven Multimodule Design」に適応させることを考えていました。ただし、Spring Services/Beanを作成したい場合は、1つのモジュールでさまざまなライブラリを使用するだけで、他のモジュールが使用するライブラリを使用するという理由だけで、異なるモジュールに実装することはありません:-)
解決
Maven 3.1は、「ミキシン」を導入してこの問題を解決する必要があります。それまでの間、このブログ投稿で説明したように、プロファイルを適切に使用することで、必要な機能のほとんどを取得できるようです。
http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles
便利かどうか教えてください。
他のヒント
私はあなたがそれが悪夢かもしれないと言ったことを知っていますが、私はあなたの親の間の相続が行く方法であると強く感じています。
優れたマルチモジュールプロジェクト構造について説明します この答え. 。また、アグリゲーターと親を追跡する継承の使用についても説明しています。
物事を整理して正気に保つのに役立ついくつかのこと...
- 適切な命名規則を使用します。親プロジェクトに電話するだけではありません
parent1
とparent2
. 。どのような依存関係やその他のものを構成するかを説明する名前を使用して、いつ使用するかを人々が知ることは直感的です。 - Mavenのリリース/展開機能を使用して、これらがリポジトリに適切にバージョンになっており、常に固定バージョンアーティファクトを参照してください。スナップショットを使用しないことは、決定論的で再現可能なビルドを持つための最初のステップです。物事がその場で変化しているときの問題のデバッグは非常に困難です。
- POM.xmlファイルに頼って、プロジェクトが必要とする依存関係を知ることはできません。これにより、継承やカスタムプロファイルなどの他のものを避けることができます。を使用する必要があります Maven依存性 - プギン これらの分析タスクを実行します。のようなコマンドがあります
mvn dependency:tree
プロジェクトのすべての依存関係を示し、mvn dependency:analyze
これは、未使用の依存関係を示しています。
うまくいけば、このアドバイスにより、親POMファイルの継承はそれほど複雑で悪夢のように思えません。幸運を!
主にバージョン(number)コントロールに関する場合 - 親プロジェクトのプロパティとして依存関係バージョンのみを指定して、子プロジェクトで使用しないのはなぜですか。
親
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>foo.bar</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
<log4j.version>1.2.16</log4j.version>
</properties>
</project>
子
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>maven-parent</artifactId>
<groupId>foo.bar</groupId>
<version>0.0.1</version>
</parent>
<groupId>foo.bar</groupId>
<artifactId>maven-child</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</project>
これは、一貫したバージョン番号を持つ特定のプロジェクト依存関係を指定できる簡単なソリューションです。