マルチモジュール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つのものがある場合、ビルドを続行するために中間製品をインストールする必要がないことを直感的に理解できます。私の考えがここで何らかの意味をなしたことを願っています...
問題は、依存関係を指定すると、Mavenがそれをjar(または何でも)としてパッケージ化し、少なくともローカルリポジトリから利用できるようになることを期待していることだと思います。 commonsプロジェクトでmvn install
を最初に実行すると、すべてが機能するはずです。
このMavenメーリングリストスレッド で説明したように、dependency:treeゴール自体は、リアクターではなくリポジトリーで検索します。これを回避するには、以前に提案したようにmvnをインストールするか、リアクターを呼び出す以下のような面倒なことを行います。
mvn compile dependency:tree
私のために働く。
これを実現するのは古いスレッドですが、ツールが進化したか、初めて見逃した可能性があります。
リアクタービルドを実行することにより、インストールせずに依存関係を解決するビルドを実行することができます。
プロジェクトのモジュール構造を記述する親でビルドを開始すると、モジュール間の依存関係は、ビルド中に内部Mavenリアクターを通じて解決されます。
もちろん、これは構造内の単一の個別モジュールのビルドを解決しないため、完璧なソリューションではありません。この場合、Mavenはリアクターに依存関係を持たず、リポジトリーで解決しようとしています。そのため、個々のビルドでは、最初に依存関係をインストールする必要があります。
以下に、この状況を説明する 参照 を示します。
私にとって、このスレッドにつながったのは同様の問題であり、解決策はすべてのモジュール依存関係pomが持っていたことを確認することでした
<packaging>pom</packaging>
親が持っていた
ポンポン
私のモデルデップにはポンポンがついていたので、見つけられる瓶はありませんでした。
私のために働いた唯一のこと:gradleへの切り替え:(
私が持っています
Parent
+---dep1
+---war1 (using dep1)
そして、war1でcdしてmvn Tomcat7:run-warを使用するだけです。 war1は親を参照し、親はwar1とdep1を(モジュールとして)参照するため、すべての依存関係が既知である必要がありますが、常にプロジェクト全体をインストールする必要があります。
私は問題が何であるか理解していません。
このようなMavenモジュール構造では:
- parent
- child1
- child2
parent
pom
には次のものがあります。
<modules>
<module>child1</module>
<module>child2</module>
</modules>
child1
のchild2
に以下を入力して、<dependencies>
のchild2
に依存している場合:
<dependency>
<groupId>example</groupId>
<artifactId>child1</artifactId>
</dependency>
child1
のJARが見つからないというエラーを受け取ります。これは、pom
のparent
に<dependencyManagement>
を含むchild1
ブロックを宣言することで解決できます。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>example</groupId>
<artifactId>child1</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
child1
は、compile
またはpackage
などの目標をparent
で実行するとビルドされ、child2
はchild1
を検出しますコンパイルされたファイル。
answer from Don Willis からのボーナス:
ビルドがテストjarファイルを作成して、リアクタサブモジュール間でテストコードを共有する場合は、以下を使用する必要があります。
mvn test-compile dependency:tree
dependency:tree
この場合、最後まで実行します。