在运行 mvn 依赖项: 树时,Maven 不能识别兄弟模块

我正在尝试设置一个多模块 Maven 项目,很明显,模块间的依赖关系没有正确设置。

我有:

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

在父 POM 中(具有包装类型的 POM) 然后是子目录 commons/storage/,它们定义具有相同名称的 JAR poms。

存储依赖于公共资源。

在 main (master)目录中,我运行 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

为什么对“ commons”的依赖会失败,即使反应堆显然已经看到了,因为它成功地处理了依赖树?它绝对不应该去网上找它,因为它就在那里..。

储藏室的彩球:

<?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 来构建依赖于 X 的模块 Y,因为这两个模块都是从同一个父 POM 引用的。如果在同一个源代码树中有两个东西,那么我就不必安装中间产品来继续构建,这对我来说是很直观的。希望我的想法有点道理。

47752 次浏览

I think the problem is that when you specify a dependency Maven expects to have it as jar (or whatever) packaged and available from at least a local repo. I'm sure that if you run mvn install on your commons project first everything will work.

As discussed in this maven mailing list thread, the dependency:tree goal by itself will look things up in the repository rather than the reactor. You can work around this by mvn installing, as previously suggested, or doing something less onerous that invokes the reactor, such as

mvn compile dependency:tree

Works for me.

Realizing this is an older thread but it seems that either the tool evolved or this might have been missed the first time around.

It is possible to perform a build that makes dependencies resolved without installing by doing a reactor build.

If you start your build in the parent that describes the module structure of your project then your dependencies between your modules will be resolved during the build itself through the internal Maven reactor.

Of course this is not the perfect solution since it does not solve the build of a single individual module within the structure. In this case Maven will not have the dependencies in his reactor and will bee looking to resolve it in the repository. So for individual builds you still have to install the dependencies first.

Here is some reference describing this situation.

for me, what led me to this thread was a similar problem and the solution was to ensure all module dependency pom's had

 <packaging>pom</packaging>

the parent had

pom

my model dep had pom - so there was no jar to be found.

The only thing that workd for me : switching to gradle :(

I have

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

and I can just cd in war1 and use mvn tomcat7:run-war. I always have to install the whole project before, despite war1 references his parent and the parent references war1 and dep1 (as modules) so all dependencies should be known.

I don't understand what the problem is.

Make sure the module which is failing gets resolved in the pom, is pointing to the right parent by including the configurations in the pom file of the module.

In a Maven module structure like this:

- parent
- child1
- child2

You will have in the parent pom this:

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

If you now depend on child1 in child2 by putting the following in your <dependencies> in child2:

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

You will receive an error that the JAR for child1 cannot be found. This can be solved by declaring a <dependencyManagement> block including child1 in the pom for parent:

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

child1 will now be build when you run a compile or package etc. goal on parent, and child2 will find child1's compiled files.

Bonusing off the answer from Don Willis:

If your build creates test-jars to share test code among your reactor submodules you should use:

mvn test-compile dependency:tree

which will allow dependency:tree to run to completion in this case.

Using version >= 3.1.2 of the dependency plugin seems to solve the issue.