Mavenはmvn dependency:treeを実行しているときに兄弟モジュールを認識しません


90

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

私が持っています:

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

親POM(パッケージ化タイプのpomを持つ)、次にサブディレクトリにcommons/ありstorage/、同じ名前のJAR pom を定義します。

ストレージはCommonsに依存します。

メイン(マスター)ディレクトリで実行する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

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

ストレージ用のポン:

<?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をインストールする必要はありません。これは、同じソースツリーに2つのものがある場合、ビルドを続行するために中間製品をインストールする必要がないことを私に直感的に理解します。うまくいけば、私の考えがここで理にかなっています...


2
ああ、編集は完璧です。どうして最初の意図でこれを書かなかったのですか?また、おそらくタイトルを変更することを検討してください:)私はうるさいという意味ではありません。これは、明確さと分類のためです。これは、同様の問題(依存関係:ツリーに関する実際のタイトルとコンテンツでは明確ではない)を検索するときに、将来的にコミュニティ全体を支援します
Pascal Thivent 2009年

1
こんにちは。解決策は見つかりましたか?私もこの問題を抱えています:(

1
コンパイルは失敗しますか、それとも依存関係:ツリーの目標だけですか?ドン・ウィリスの答えを見てください。
metamatt 2011年

1つのモジュールで別のモジュールのシンボルが見つからないために失敗した場合、OMGは依存関係として追加し、JARとしてインストールする必要がありますか?これが鍵です...
WesternGun 2017

それは悲しいですmaven 3.6はまだこの問題を解決していません
yuxh

回答:


21

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


4
ソースツリーにあるモジュールのバージョンを使用するように指定する方法はありますか?このケースは自動的に処理されると思いました。プロジェクト全体を作成するたびにMavenがbuild-install-build-install-buildを実行する必要があるとは思わない/思わない!
Steven Schlansker、

38
インストールを実行すると修正されることは間違いありません。ただし、変更を加えるたびにインストールする必要があるため、これは望んでいません。ストレージプロジェクトで、commonsプロジェクトから最新のコードを取得したいと考えています。
Steven Schlansker、

私は実際に同様の問題に対処しなければならず、悲しいかな-今のところ答えを見つけることができません。Mavenは依存関係がモジュールにリンクされていることを気にしていないようですが、すぐにリポジトリに移動します。私はあなたの質問にお気に入りを載せます-たぶんいくつかのグルが応答します これが可能かどうかを知りたい
Bostone 2009年

@Steven懸念事項を別の質問として投稿してください。コメントで回答するのは簡単ではありません。これは別のテーマです。
Pascal Thivent 2009年

6
それが主な質問であることを意図していた、私は単に明確にしていた。元の質問では、同じプロジェクトで他のモジュールをビルドするために、ビルドされた製品をローカルリポジトリに置く必要がないことを明確にしていませんか?
Steven Schlansker、

104

このMavenメーリングリストのスレッドで説明したように、dependency:treeの目標は、リアクターではなくリポジトリで検索します。以前に提案されたようにmvnをインストールするか、reactorを呼び出す煩わしさを軽減することで、これを回避できます。

mvn compile dependency:tree

私のために働く。


2
その安価な回避策をありがとう。しかし、それはバグですか?依存関係を期待します。ツリーの目標は、トリックなしでリアクタに依存します。
mcoolive 2015

グローバルに実行されるタスクでも同じ状況が発生しますが、影響を受けるのは一部のサブプロジェクトのみです。
tkruse 2017

残念ながら、compile推移的な依存関係のダウンロードをトリガーします。実際にそれらをダウンロードせずに依存関係ツリーをリストする方法もあります(もちろんPOMを除く)?
sschuberth

他の目標についても同じ問題がありました。追加compilevalidate:十分ではありません)があまりにもそこに役立ったmvn compile animal-sniffer:checkmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
MSA

ビルドによっては、一部のモジュールが、後のフェーズでビルドされるアーティファクトに依存する場合もあります。私の場合、ZIPファイル(maven-assembly-pluginを使用)がpackage段階的にビルドされたため、たとえばを実行する必要がありましたmvn package animal-sniffer:check
msa

6

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

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

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

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

この状況を説明するリファレンスがいくつかあります


1
最初に依存関係をインストールせずに完全な親プロジェクトをビルドせずに、単一のモジュールをビルドする方法はありますか?
QUITあり-Anony-Mousse 2013年

1
答えを完了するために-プラグインが直接(フェーズなしで)呼び出された場合などmvn dependency:tree、フェーズを呼び出さない限り、ソースからの依存関係は解決されませんcompile。したがって、これは代わりに機能しますmvn compile dependency:tree
Stanislav Bashkyrtsev

3

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

 <packaging>pom</packaging>

親が持っていた

ポンポン

私のモデルdepにはpomがあったため、jarが見つかりませんでした。


それは私にこのエラーを投げます:POMを読んでいる解析エラー。理由:認識されないタグ: 'packaging'
hithwen

編集:<packaging> pom </ packaging>が修正したものです。<packaging> jar </ packaging>の置き換え
bsautner 2013年

4
これにより、質問で説明されている問題が修正されますが、子モジュールはエクスポート可能なアーカイブ(jar、wars、ears)を生成しません。
sheldonh 2014

sheldonhは、このエラーを修正してエクスポート可能なアーカイブを作成するための解決策を見つけましたか?
user3853134

3

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

私が持っています

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

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

問題が何なのかわかりません。


1
これが、マルチモジュールプロジェクトを作成する必要があるときにGradleを使用する理由です。:(
卓英

2

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

- parent
  - child1
  - child2

あなたはparent pomこれを持っています:

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

あなたが今に依存している場合child1child2、あなたに次のように入れて<dependencies>child2

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

のJAR child1が見つからないというエラーが表示されます。これはfor <dependencyManagement>を含むブロックを宣言することで解決できます:child1pomparent

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

child1compileまたはpackageなどの目標を実行するとビルドされparent、のコンパイル済みファイルchild2が見つかりchild1ます。


2

ドンウィリスからの回答のボーナス:

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

mvn test-compile dependency:tree

dependency:treeこの場合、実行を完了することができます。


-1

障害のあるモジュールがpomで解決され、モジュールのpomファイルに構成を含めることにより、正しい親を指していることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.