5

同様の質問がいくつかありますが、このようなものはありません。この状況にどのように対処しますか(一般的なシナリオ):

親アーティファクト/プロジェクトと、他のプロジェクトをモジュールとして主に使用/宣言する1つのメインプロジェクトを持つ、8〜11の子プロジェクトのプロジェクト。

問題は、すべてのプロジェクトがのような共通の依存関係のみを「厳密に」共有することtestng, logging, apache commons and stuffです。しかし、常に3つが同じ特定の深度(apache-chemistry、jackrabbit、abderaなど)の50〜60%を使用するように、別の2〜3つも同じであるが異なる依存関係の50〜60%を使用します。そして、メインのものは多くの同じdepsを使用します。

これらの「厳密に」共有されていない部門を、他の人が継承できるように親プロジェクトに入れることはできません。したがって、共通の部門のみが継承されます。そして、重複する依存関係がたくさんあります。そして、私はそれらのバージョンを管理することしかできません<dependencyManagement>

もう1つのオプションは、親pomにほとんどの依存関係を含めることですが、子プロジェクトは必要のないものも継承します。

親プロジェクトを複数持つこともできますが、それは正しくありません。また、親pom定義を適切に文書化/コメントしないと、プロジェクトに必要な依存関係がわからないため、親プロジェクトからの継承は悪夢になる可能性があります。

もう1つの方法は、依存関係コンテナーとしてのみ機能するpomアーティファクトを作成することです。これらは、依存関係の特定のグループを宣言するため、モジュールは、推移的な依存関係を取得するためにそれらを宣言するだけです。しかしねえ、あなたはある種の展開とコミットをしたいですか

OneDepArtifact宣言jackrabit, abdera, chemistry

宣言するAnotherDepArtifacthtmlcleaner, google-api, tika

ThirdDepArtifact宣言spring, httpclient, selenium

これは非常に混乱しています<dependencyManagement>。正しく使用するかどうかはわかりません。依存関係のバージョンを管理する場合にのみ役立つようです。

私は自分のアプリ開発を「Mavenマルチモジュール設計」に適応させることを考えていました。ただし、さまざまなライブラリを使用するだけのSpringサービス/ Beanを1つのモジュールで作成する場合は、他のモジュールも使用するライブラリを使用するという理由だけで、それらを別のモジュールに実装することはありません:-)

4

3 に答える 3

3

悪夢かもしれないとおっしゃっていたのは知っていますが、親のpom間の継承が道だと強く感じています。

この回答では、優れたマルチモジュールプロジェクト構造について説明します。また、アグリゲーターと親チェーンの継承の使用についても説明します。

物事を整理して正気に保つのに役立ついくつかのこと...

  • 適切な命名規則を使用してください。parent1親プロジェクトとを呼び出すだけではありませんparent2。どのような種類の依存関係やそれらが構成するその他のものを説明する名前を使用して、人々がいつどちらを使用するかを直感的に理解できるようにします。
  • Mavenのリリース/デプロイ機能を使用して、これらがリポジトリで適切にバージョン管理され、常に修正バージョンのアーティファクトを参照するようにします。SNAPSHOTを使用しないことは、決定論的で再現可能なビルドを作成するための最初のステップです。物事がその場で変化しているときに問題をデバッグすることは非常に困難です。
  • プロジェクトに必要な依存関係を知るためにpom.xmlファイルに依存しないでください。これにより、継承やカスタムプロファイルなどの他のものを回避できます。これらの分析タスクを実行するには、 maven-dependency-pluginを使用する必要があります。mvn dependency:treeプロジェクトのすべての依存関係を表示したり、未使用の依存関係を表示したりするようなコマンドがありますmvn dependency:analyze

うまくいけば、このアドバイスがあれば、親POMファイルの継承はそれほど複雑で悪夢のようには見えないでしょう。幸運を!

于 2011-06-14T21:59:21.190 に答える
3

Maven 3.1は、「ミックスイン」を導入することでこの問題を解決する必要があります。それまでの間、このブログ投稿で説明したように、プロファイルを適切に使用することで、必要な機能のほとんどを取得できるようです。

http://weblogs.java.net/blog/fabriziogiudici/archive/2011/07/19/maven-pom-composition-means-profiles

役に立ったかどうか教えてください。

于 2011-07-19T17:57:29.170 に答える
-1

主にバージョン(番号)コントロールに関する場合-依存関係バージョンのみを親プロジェクトのプロパティとして指定し、子プロジェクトで使用しませんか?

<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>

これは、一貫したバージョン番号を使用して特定のプロジェクトの依存関係を指定できる単純なソリューションです。

于 2011-06-14T19:50:19.847 に答える