99

我正在尝试设置一个多模块 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

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

用于存储的 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 来构建依赖于 X 的模块 Y,因为两者都是从同一个父 POM 引用的模块。这对我来说很直观,如果我在同一个源代码树中有两个东西,我不应该安装中间产品来继续构建。希望我的想法在这里有意义......

4

9 回答 9

120

正如在这个 maven 邮件列表线程中所讨论的,dependency:tree 目标本身将在存储库而不是反应器中查找内容。您可以通过 mvn 安装来解决这个问题,如前所述,或者做一些不那么繁琐的调用反应器的事情,例如

mvn compile dependency:tree

为我工作。

于 2009-12-15T08:20:09.263 回答
22

我认为问题在于,当您指定依赖项时,Maven 期望将其作为 jar(或其他)打包并至少从本地存储库中可用。我敢肯定,如果您mvn install首先在公共项目上运行,一切都会正常工作。

于 2009-11-05T00:10:31.893 回答
8

意识到这是一个较旧的线程,但似乎该工具已经进化,或者这可能是第一次错过了。

可以通过进行 reactor 构建来执行构建来解决依赖关系而无需安装。

如果您在描述项目模块结构的父级中开始构建,那么您的模块之间的依赖关系将在构建过程中通过内部 Maven 反应器解决。

当然,这不是完美的解决方案,因为它不能解决结构内单个模块的构建问题。在这种情况下,Maven 在他的反应器中将没有依赖项,并且会在存储库中寻找解决它。因此,对于单个构建,您仍然必须先安装依赖项。

这是描述这种情况的一些参考资料。

于 2011-12-21T02:50:04.200 回答
8

奖励唐威利斯的答案

如果您的构建创建了 test-jars 以在您的反应器子模块之间共享测试代码,您应该使用:

mvn test-compile dependency:tree

在这种情况下,这将允许dependency:tree运行完成。

于 2019-07-26T19:29:51.247 回答
4

唯一对我有用的东西:切换到 gradle :(

我有

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

我可以在 war1 中 cd 并使用 mvn tomcat7:run-war。尽管war1引用了他的父级并且父级引用了war1和dep1(作为模块),但我之前总是必须安装整个项目,因此应该知道所有依赖项。

我不明白问题是什么。

于 2015-11-12T23:05:53.227 回答
2

对我来说,导致我进入这个线程的是一个类似的问题,解决方案是确保所有模块依赖 pom 都有

 <packaging>pom</packaging>

父母有

绒球

我的模型部门有 pom - 所以找不到罐子。

于 2012-12-23T15:28:52.873 回答
2

在这样的 Maven 模块结构中:

- parent
  - child1
  - child2

你将在parent pom这个:

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

如果您现在通过将以下内容放入您的in来依赖child1in :child2<dependencies>child2

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

您将收到child1无法找到 JAR 的错误。这可以通过声明一个包含在for中的<dependencyManagement>块来解决:child1pomparent

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

child1现在将在您在 上运行compileor packageetc. 目标时构建parentchild2并将找到child1的已编译文件。

于 2019-04-30T05:32:52.930 回答
0

使用版本 >= 3.1.2 的依赖插件似乎可以解决问题。

于 2021-12-24T10:03:16.647 回答
-1

确保失败的模块在 pom 中得到解决,通过在模块的 pom 文件中包含配置来指向正确的父级。

于 2017-01-11T10:39:11.393 回答