运行mvn依赖项时,Maven无法识别兄弟模块:tree

Ste*_*ker 85 java dependencies maven-2 maven

我正在尝试设置一个多模块Maven项目,并且模块间依赖关系显然没有正确设置.

我有:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

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

存储取决于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
Run Code Online (Sandbox Code Playgroud)

为什么对"公共"的依赖性失败,即使反应堆显然已经看到它,因为它成功地处理了它的依赖树?绝对不应该去'网找到它,因为它就在那里......

存储用的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>
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何建议!

(编辑)

为了澄清,我在这里寻找的是:我不想安装模块X来构建依赖于X的模块Y,因为两者都是从同一父POM引用的模块.这对我来说很直观,如果我在同一个源代码树中有两件事,我就不必安装中间产品来继续构建.希望我的想法在这里有所帮助......

Don*_*lis 96

正如在这个maven邮件列表线程中讨论的那样,依赖:树目标本身将在存储库而不是反应堆中查找.你可以通过mvn安装来解决这个问题,如前所述,或者做一些不那么繁重的调用反应堆的东西,比如

mvn compile dependency:tree
Run Code Online (Sandbox Code Playgroud)

适合我.

  • 谢谢你的廉价解决方法.但这是一个错误吗?我期待依赖:树的目标依赖于反应堆没有任何技巧. (2认同)

Bos*_*one 20

我认为问题在于,当你指定依赖时,Maven希望将它作为jar(或其他)打包并至少从本地repo中获取.我敢肯定,如果你运行mvn install你的公共项目,一切都会有效.

  • 你运行安装修复它是正确的.但是,现在每次进行更改时都必须安装,这不是我想要的.我希望存储项目从commons项目中获取最新代码. (34认同)
  • 这是一个主要问题,我只是澄清.我是否在原始问题中没有明确表示我的意图是不要求构建的产品在本地存储库中以在同一个项目中构建其他模块? (6认同)
  • 有没有办法指定我希望它使用源树中的任何版本的模块?我认为这种情况会自动处理.每次我只想制作整个项目时,我不想/不认为Maven需要构建-install-build-install-build! (3认同)

adr*_*k20 7

Bonusing关闭答案唐·威利斯

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

mvn test-compile dependency:tree
Run Code Online (Sandbox Code Playgroud)

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


New*_*ian 6

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

通过执行reactor构建,可以执行构建以使依赖性解析而无需安装.

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

当然,这不是完美的解决方案,因为它无法解决结构中单个模块的构建问题.在这种情况下,Maven将不会在他的反应堆中具有依赖关系,并且希望在存储库中解决它.因此,对于单个构建,您仍然必须首先安装依赖项.

以下是描述这种情况的一些参考.

  • 为了完成答案 - 如果插件被直接调用(没有阶段),例如 `mvn dependency:tree`,它仍然不会从源解析依赖项,除非你调用 `compile` 阶段。所以这会起作用:`mvn compile dependency:tree`。 (2认同)

小智 5

在这样的 Maven 模块结构中:

- parent
  - child1
  - child2
Run Code Online (Sandbox Code Playgroud)

您将在parent pom此:

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

child1compile现在将在您在 上运行或package等目标时构建parent,并且child2会找到child1的编译文件。