maven在运行MVND时不识别同级模块ependency:tree

pkbketx9  于 2021-06-30  发布在  Java
关注(0)|答案(8)|浏览(451)

我正在尝试设置一个多模块maven项目,而模块间的依赖关系显然没有正确设置。
我有:

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

在父pom(具有打包类型pom)中,然后在子目录中 commons/ 以及 storage/ 用相同的名称定义jar pom。
存储依赖于公共空间。
在主(主)目录中,我运行 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”的依赖失败了,尽管React堆显然看到了它,因为它成功地处理了它的依赖树?它肯定不会在网上找到它,因为它就在那里。。。
储存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引用的。这对我来说很直观,如果我在同一个源代码树中有两个东西,我就不必安装中间产品来继续构建。希望我的想法有点道理。。。

8fsztsew

8fsztsew1#

唯一对我有用的是:换成grad尔:(
我有

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

我可以在war1中使用cd和mvntomcat7:runwar。我总是要安装整个项目之前,尽管war1引用他的父和父引用war1和dep1(作为模块),所以所有的依赖关系应该是已知的。
我不明白问题出在哪里。

gwbalxhn

gwbalxhn2#

意识到这是一个旧的线程,但似乎要么是工具的演变,要么这可能已经错过了第一次。
可以通过执行reactor构建来执行一个构建,该构建可以在不安装的情况下解析依赖关系。
如果您在描述项目模块结构的父级中开始构建,那么您的模块之间的依赖关系将在构建期间通过内部maven reactor得到解决。
当然,这不是完美的解决方案,因为它不能解决结构中单个模块的构建问题。在这种情况下,maven的reactor中没有依赖项,而是希望在存储库中解决它。因此,对于单个构建,您仍然必须首先安装依赖项。
这里有一些描述这种情况的参考资料。

p3rjfoxz

p3rjfoxz3#

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

<packaging>pom</packaging>

父母有
聚甲醛
我的模特dep有pom,所以找不到jar。

fwzugrvs

fwzugrvs4#

正如maven邮件列表线程中所讨论的,dependency:tree goal 它自己将在存储库而不是React堆中查找内容。您可以通过安装mvn来解决这个问题,如前面所建议的,或者执行一些调用reactor的不那么繁重的操作,例如

mvn compile dependency:tree

对我有用。

kxeu7u2r

kxeu7u2r5#

我认为问题在于,当您指定一个依赖项时,maven希望将其打包为jar(或任何东西),并至少从本地repo获得。我敢肯定如果你跑 mvn install 在你的公共项目上,一切都会好起来的。

b1zrtrql

b1zrtrql6#

用唐·威利斯的答案:
如果您的构建创建了测试jar,以便在reactor子模块之间共享测试代码,那么您应该使用:

mvn test-compile dependency:tree

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

r55awzrz

r55awzrz7#

在这样的maven模块结构中:

- parent
  - child1
  - child2

你会在
parent pom 这是:

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

如果你现在依靠 child1child2 通过在你的 <dependencies>child2 :

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

您将收到一个错误,jar child1 找不到。这可以通过声明 <dependencyManagement> 块包括 child1pom 为了 parent :

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>
``` `child1` 现在将在运行 `compile` 或者 `package` 等目标 `parent` ,和 `child2` 会发现 `child1` 的编译文件。
zqry0prt

zqry0prt8#

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

相关问题