1

私はMavenを広範囲に使用していません

現在、5 つの異なる Maven プロジェクトがあり、それぞれに異なる pom.xml があります。現在、それらの間には依存関係があり、必要に応じてそれぞれが <依存関係> で他を指しています。

ここに画像の説明を入力

現在、私たちが嫌いなことは

  1. 子 projectA をリリースするとき、新しいバージョンを使用するために、依存関係として projectA を持つすべてのプロジェクトを手動で変更する必要があります。Saw Maven には version plugin がありますが、それがどのように役立つかはわかりません。
  2. 解決策として、私は poms 間のよりクリーンな組織を持ち、上記の問題を回避したいと考えています。

私が考えたのは(間違っているかもしれません

ここに画像の説明を入力

太い矢印は親子関係を表し、細い矢印はサブモジュールを表します。しかし、これは機能していないようです。以下のコードとエラーを参照してください

子プロジェクト 2 ポン

  <groupId>ChildProject2</groupId>
  <artifactId>ChildProject2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
     <groupId>Parent</groupId>
     <artifactId>Parent</artifactId>
     <version>${parent.version}</version>
     <relativePath>../Parent/pom.xml</relativePath>
  </parent>
  <dependencies> ...   </dependencies>

ChildProject2 - エラープロジェクト ビルド エラー: 解決できない親 POM: http://repo1.maven.org/maven2 からの Parent:Parent:pom:${parent.version} の転送に失敗しましたが、ローカル リポジトリにキャッシュされました。解決は行われませんCentral の更新間隔が経過するか、更新が強制されるまで再試行されます。元のエラー: アーティファクト Parent:Parent:pom:${parent.version} を中央 ( http://repo1.maven.org/maven2 ) から転送できませんでした: インデックス 45 のパスに無効な文字: http://repo1 .maven.org/maven2/Parent/Parent/ ${parent.version}/Parent-${parent.version}.pom および 'parent.relativePath' が間違ったローカル POM を指している

親ポン

  <groupId>Parent</groupId>
  <artifactId>Parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
   <parent.version>0.0.1-SNAPSHOT</parent.version>
  </properties>

  <modules>
    <module>../ChildProject2</module>
    <module>../ChildProject1</module>
  </modules>

  <dependencies> ...  </dependencies>

祖父母 2 ポン

  <groupId>GrandParent2</groupId>
  <artifactId>GrandParent2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
   <grandparent2.version>0.0.1-SNAPSHOT</grandparent2.version>
  </properties>

  <modules>
    <module>../Parent</module>
  </modules>

  <dependencies>...  </dependencies>

ParentMain.java

public class ParentMain {

    public static void main(String[] args) {
        DocumentFactory df = new DocumentFactory();
        ChildProject1Main cp1 = new ChildProject1Main();
        ChildProject2Main cp2 = new ChildProject2Main();
    }

}

ParentMain - エラー

    • ChildProject1Main を型に解決できません
    • ChildProject1Main を型に解決できません

現在、Maven バージョン2.2.1 を使用しています (アップグレードされた Maven バージョンを使用してこれを解決できる場合は、アップグレード可能です) 以下のコメントの 1 つは、「Jenkins や TeamCity などの CI ツール」を使用してこれを解決できると述べています.. 任意のポインター (例) Maven (およびまたは Hudson ) を使用してこれを解決する方法??

私は何を間違っていますか、そのようなプロジェクトの依存関係に最適な設計を取得する方法

4

2 に答える 2

1

この図を見て最初に思ったのは、「ビジネス ロジックがサブモジュールになんらかの依存関係を持っているのはなぜだろうか」ということでした。2 つの考えが思い浮かびました。それぞれの考えと、これらを繰り返すためにしてはいけないことについて説明します。

  1. 密結合コード。 これは、コードの重複または大規模なクラス/メソッドの臭いに現れます。

    コードをモジュール化して、エラーなしでコンパイルおよび実行するためにプロジェクトが必要なものだけに依存するようにします。

  2. 非論理的なコード階層。 これは (最終的に) 循環的な依存関係、または<exclude>ブロックが表示されると突然失われる依存関係として現れます。

    コード階層が適切にレイアウトされるように、明示的にするものに依存する行が必要です。

プロジェクトが別のプロジェクトに依存していることを意味するために、矢印を 1 つのカーディナリティに当てはめます。そのため、UI と CLI がビジネス ロジックに依存して機能することは理にかなっています。ビジネス ロジックが子モジュールに依存して、コアとはまったく関係のない他の機能を実行できることも理にかなっています。

意味をなさないのは、これらの子モデルもビジネス ロジックに依存しているということです。子モジュールは、ビジネス ロジックに依存する必要がないように十分に一意である必要があります。もしそうなら、おそらく彼らは代わりにそこに住むべきです。

バージョニングに関しては、Jenkins や TeamCity など、その問題を解決するのに役立つ CI ツールがあります。推力は、人間の介入/エラーとは無関係に発生するように設定することです。

于 2013-06-30T04:09:06.757 に答える
0

依存関係の最新バージョンを使用するよう Maven に指示するにはどうすればよいですか?

上記のスレッドを見てください。バージョン プラグインを使用してジェンキンスの pom のバージョンを更新するという Adam Gent の回答が気に入っています。私は、maven と継続的デプロイメントが特に相性が悪いという彼の意見に同意します。

したがって、共有構成(プラグイン、依存関係など)にはそれと単純な親pomを使用しますが、それらをマルチモジュールプロジェクトとバージョンにして、親pomを独立したものとしてリリースしないでください。

于 2013-06-30T11:29:56.553 に答える