web-dev-qa-db-ja.com

Mavenの依存関係を実行するときにMavenは兄弟モジュールを認識しません:ツリー

マルチモジュールMavenプロジェクトをセットアップしようとしていますが、モジュール間の依存関係が明らかに正しくセットアップされていません。

私が持っています:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

親POM(パッケージングタイプのPOMがある)で、サブディレクトリcommons/およびstorage/は、同じ名前のJAR pomsを定義します。

ストレージはコモンズに依存しています。

メイン(マスター)ディレクトリで、mvn dependency:treeおよび参照:

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

リアクターが依存関係ツリーを正常に処理するために、明らかに「コモン」への依存関係が失敗するのはなぜですか?まさにそこにあるので、それを見つけるために「ネット」に行くべきではありません...

ストレージ用のPOM:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.Apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.Apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

提案をありがとう!

(編集)

明確にするために、ここで探しているのはこれです:Xに依存するモジュールYを構築するためにモジュールXをインストールする必要はありません。両方が同じ親POMから参照されるモジュールだからです。これは、同じソースツリーに2つのものがある場合、ビルドを続行するために中間製品をインストールする必要がないことを直感的に理解できます。私の考えがここで何らかの意味をなしたことを願っています...

84

問題は、依存関係を指定すると、Mavenがそれをjar(または何でも)としてパッケージ化し、少なくともローカルリポジトリから利用できるようになることを期待していることだと思います。 commonsプロジェクトでmvn installを最初に実行すると、すべてが機能するはずです。

19
Bostone

このMavenメーリングリストスレッド で説明したように、dependency:treeゴール自体は、リアクターではなくリポジトリーで検索します。これを回避するには、以前に提案したようにmvnをインストールするか、リアクターを呼び出す以下のような面倒なことを行います。

mvn compile dependency:tree

私のために働く。

93
Don Willis

これを実現するのは古いスレッドですが、ツールが進化したか、初めて見逃した可能性があります。

リアクタービルドを実行することにより、インストールせずに依存関係を解決するビルドを実行することができます。

プロジェクトのモジュール構造を記述する親でビルドを開始すると、モジュール間の依存関係は、ビルド中に内部Mavenリアクターを通じて解決されます。

もちろん、これは構造内の単一の個別モジュールのビルドを解決しないため、完璧なソリューションではありません。この場合、Mavenはリアクターに依存関係を持たず、リポジトリーで解決しようとしています。そのため、個々のビルドでは、最初に依存関係をインストールする必要があります。

以下に、この状況を説明する 参照 を示します。

6
Newtopian

私にとって、このスレッドにつながったのは同様の問題であり、解決策はすべてのモジュール依存関係pomが持っていたことを確認することでした

 <packaging>pom</packaging>

親が持っていた

ポンポン

私のモデルデップにはポンポンがついていたので、見つけられる瓶はありませんでした。

3
bsautner

私のために働いた唯一のこと:gradleへの切り替え:(

私が持っています

Parent
  +---dep1
  +---war1 (using dep1)

そして、war1でcdしてmvn Tomcat7:run-warを使用するだけです。 war1は親を参照し、親はwar1とdep1を(モジュールとして)参照するため、すべての依存関係が既知である必要がありますが、常にプロジェクト全体をインストールする必要があります。

私は問題が何であるか理解していません。

3
mba

このようなMavenモジュール構造では:

- parent
  - child1
  - child2

parentpomには次のものがあります。

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

child1child2に以下を入力して、<dependencies>child2に依存している場合:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

child1のJARが見つからないというエラーを受け取ります。これは、pomparent<dependencyManagement>を含むchild1ブロックを宣言することで解決できます。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1は、compileまたはpackageなどの目標をparentで実行するとビルドされ、child2child1を検出しますコンパイルされたファイル。

0
bothor

answer from Don Willis からのボーナス:

ビルドがテストjarファイルを作成して、リアクタサブモジュール間でテストコードを共有する場合は、以下を使用する必要があります。

mvn test-compile dependency:tree

dependency:treeこの場合、最後まで実行します。

0
adrock20