【问题标题】:Understanding maven dependencies了解 Maven 依赖项
【发布时间】:2018-01-23 15:49:26
【问题描述】:

我试图理解一个 java 代码包(我们称之为 mainPackage),它具有从另一个包的导入(我们称之为 commonUtility)。我可以看到导入语句,但无法直接在 pom 文件中看到依赖项。我只需要了解这一点就可以对 commonUtility 进行一些更改,以便它可以反映在我的 mainPackage jar 中。

例如我可以在 mainPackage 类文件中看到一个 import 语句

import com.training.tdw.commonUtility.transform;

所以我期待看到

<dependency>
  <groupId>com.training.tdw</groupId>
  <artifactId>commonUtility</artifactId>
  <version>1.0.1</version>
</dependency>

但它不存在。那么我将如何找出两个包装之间的墨水。如果我的理解有误,请纠正我。

【问题讨论】:

  • 不清楚你在问什么。 Maven 处理传递依赖,例如,如果 pom 文件中的 PackageA 依赖于 PackageB,那么 PackageB 可用于您的代码。也就是说,不显式定义 PackageB 版本可能会很有趣,因为如果您修改 PackageA,它可能会在您下方发生变化。
  • @DaveNewton - 我已经举了一个例子。任何帮助将不胜感激。
  • 我告诉过你如何:Maven 处理传递依赖。您的项目可以使用隐式依赖项,也可以使用显式依赖项。正如答案所说,您可以公开整个依赖关系树。但是在某些情况下依赖隐式依赖可能会产生后果。

标签: java maven


【解决方案1】:

似乎你的 pom.xml 中定义的至少一个依赖项依赖于 com.training.tdw.commonUtility:1.0.1

因此,您无需在 pom.xml 中明确指定 com.training.tdw.commonUtility:1.0.1 依赖项。这是自 Maven 2 以来出现的“传递依赖”特性的本质。

传递依赖是 Maven 2.0 中的一个新特性。这允许 您避免需要发现和指定您的库 自己的依赖需要,并自动包含它们。

见:https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

  • 请注意,“测试”范围是不可传递的!

【讨论】:

  • 谢谢,我更改了 commonUtility 的版本并包含了依赖项详细信息(版本 ID、组 ID 和工件 ID)。我在所有三个中都做了 mvn clean install 并且更改反映在 mainPackage 中。
【解决方案2】:

您可以使用dependency:tree 目标来找到它。尝试运行

mvn dependency:tree -Dverbose -Dincludes=com.training.*

这假定组 id 包含 com.training,但它可能命名为愚蠢的东西,您可以通过删除 -Dincludes 并手动查找来运行完整的依赖关系树。

或者,如果您使用 IDE,您可以导航到该包内的一个类,并且应该有一个选项可以在您的项目/包资源管理器中显示它。从那里你可以确定 JAR 文件名,它应该对应于 maven 包工件 id

【讨论】:

  • 这绝对有帮助。我可以在 jar 文件中看到依赖关系树。我将阅读更多关于传递依赖的内容。谢谢
【解决方案3】:

一个 jar 可以有一个任意的 GAV(groupId、artifactId、version),它不需要连接到你导入的包。当然,许多人以 groupId 开头他们的包名称,但其他人通常不这样做,因此没有直接的方法可以从给定的包中推断出必要的(或使用的)jar。

如果您使用的是 Nexus 2(或 MavenCentral),则有一个名为“类名搜索”的功能,可让您搜索(合格的)类名并获取包含此类类的 jar。不幸的是,Nexus 3 已经放弃了这个。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2014-07-20
    • 2012-01-12
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多