Java Maven 在运行 mvn dependency:tree 时无法识别兄弟模块

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1677473/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 21:18:03  来源:igfitidea点击:

Maven doesn't recognize sibling modules when running mvn dependency:tree

javamavenmaven-2dependencies

提问by Steven Schlansker

I'm trying to set up a multi-module Maven project, and the inter-module dependencies are apparently not being set up correctly.

我正在尝试设置一个多模块 Maven 项目,但显然没有正确设置模块间依赖项。

I have:

我有:

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

in the parent POM (which has a packaging-type pom) and then subdirectories commons/and storage/which define JAR poms with the same name.

在父 POM(它有一个打包类型的 pom)和子目录中commons/storage/这些子目录定义了同名的 JAR pom 。

Storage depends on Commons.

存储取决于共享资源。

In the main (master) directory, I run mvn dependency:treeand see:

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

Why does the dependency on "commons" fail, even though the reactor has obviously seen it because it successfully processes its dependency tree? It should definitely not be going to the 'net to find it as it's right there...

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

The pom for storage:

用于存储的 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>

Thanks for any suggestions!

感谢您的任何建议!

(Edit)

(编辑)

To clarify, what I am looking for here is this: I don't want to have to install module X to build module Y which depends on X, given that both are modules referenced from the same parent POM. This makes intuitive sense to me that if I have two things in the same source tree, I shouldn't have to install intermediate products to continue the build. Hopefully my thinking makes some sense here...

澄清一下,我在这里寻找的是:我不想安装模块 X 来构建依赖于 X 的模块 Y,因为它们都是从同一个父 POM 引用的模块。这对我来说很直观,如果我在同一个源代码树中有两个东西,我不应该安装中间产品来继续构建。希望我的想法在这里有意义......

采纳答案by Bostone

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 installon your commons project first everything will work.

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

回答by Don Willis

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

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

mvn compile dependency:tree

Works for me.

为我工作。

回答by Newtopian

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.

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

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.

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

Here is some referencedescribing this situation.

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

回答by bsautner

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

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

 <packaging>pom</packaging>

the parent had

父母有

pom

绒球

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

我的模型 dep 有 pom - 所以没有找到罐子。

回答by mba

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

唯一对我有用的东西:切换到 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.

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

I don't understand what the problem is.

我不明白问题是什么。

回答by Nitin Kamate

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.

通过在模块的 pom 文件中包含配置,确保在 pom 中解析失败的模块,并指向正确的父模块。

回答by bothor

In a Maven module structure like this:

在像这样的 Maven 模块结构中:

- parent
  - child1
  - child2

You will have in the parentpomthis:

你将在parentpom这个:

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

If you now depend on child1in child2by putting the following in your <dependencies>in child2:

如果您现在依赖于child1inchild2将以下内容放入您的<dependencies>in 中child2

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

You will receive an error that the JAR for child1cannot be found. This can be solved by declaring a <dependencyManagement>block including child1in the pomfor parent:

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

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

child1will now be build when you run a compileor packageetc. goal on parent, and child2will find child1's compiled files.

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

回答by adrock20

Bonusing off the answerfrom Don Willis:

Bonusing关闭答案唐·威利斯

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

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

mvn test-compile dependency:tree

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

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