如何在 Maven 中调试工件替换

2024-01-10

我有一个父项目包含十几个子项目,其中一个子项目使用org.apache.httpcomponents:httpclient:jar:4.3.5,这取决于org.apache.httpcomponents:httpcore:jar:4.3.2.

然而,结果版本httpcore解析为 4.2.1 而不是 4.3.2。

以下是运行时输出的提取dependency:tree在 Eclipse 中选中调试选项:

...
[DEBUG] Using mirror nexus (http://192.168.0.111:8081/nexus/content/groups/public) for apache.snapshots (http://repository.apache.org/snapshots).
[DEBUG]   testArtifact: artifact=org.apache.httpcomponents:httpclient:jar:4.3.5:compile
[DEBUG]   includeArtifact: artifact=org.apache.httpcomponents:httpclient:jar:4.3.5:compile
[DEBUG]   startProcessChildren: artifact=org.apache.httpcomponents:httpclient:jar:4.3.5:compile
[DEBUG]     manageArtifactVersion: artifact=org.apache.httpcomponents:httpcore:jar:4.3.2:compile, replacement=org.apache.httpcomponents:httpcore:jar:4.2.1
[DEBUG] Using mirror nexus (http://192.168.0.111:8081/nexus/content/groups/public) for apache.snapshots (http://repository.apache.org/snapshots).
...

它只是显示replacement=org.apache.httpcomponents:httpcore:jar:4.2.1,但它没有说明更换的原因。父项目的pom.xml使用了相当多的依赖项,即使我可以尝试一一删除这些依赖项并检查结果,但这将非常耗时。有没有更有效的方法来调试工件替换?


Here http://s000.tinyupload.com/index.php?file_id=15190723388211358348几乎是完整的日志dependency:tree从 Eclipse 中选中调试选项。


从您的日志中,您可以找到以下几行:

[DEBUG] com.company.xyz:xyz-integration-lib:jar:0.0.1-SNAPSHOT
[DEBUG]    com.company.xyz:xyz-utils:jar:0.0.1-SNAPSHOT:compile
[DEBUG]       commons-codec:commons-codec:jar:1.8:compile
[DEBUG]    javax.mail:mail:jar:1.4:provided
[DEBUG]       javax.activation:activation:jar:1.1.1:provided (version managed from 1.1 by org.jboss.spec:jboss-javaee-6.0:3.0.2.Final)
[DEBUG]    org.apache.commons:commons-lang3:jar:3.3.2:compile
[DEBUG]    junit:junit:jar:4.8.2:test
[DEBUG]    com.thoughtworks.xstream:xstream:jar:1.4.7:compile
[DEBUG]       xmlpull:xmlpull:jar:1.1.3.1:compile
[DEBUG]       xpp3:xpp3_min:jar:1.1.4c:compile
[DEBUG]    joda-time:joda-time:jar:2.4:compile
[DEBUG]    org.assertj:assertj-joda-time:jar:1.1.0:test
[DEBUG]       org.assertj:assertj-core:jar:1.3.0:test
[DEBUG]    org.apache.httpcomponents:httpclient:jar:4.3.5:compile
[DEBUG]       org.apache.httpcomponents:httpcore:jar:4.2.1:compile (version managed from 4.3.2 by org.jboss.as:jboss-as-parent:7.2.0.Final)
[DEBUG]    commons-logging:commons-logging:jar:1.1.3:compile
[DEBUG]    org.slf4j:slf4j-api:jar:1.7.7:compile
[DEBUG]    org.slf4j:slf4j-log4j12:jar:1.7.7:compile
[DEBUG]       log4j:log4j:jar:1.2.17:compile
[DEBUG]    org.mockito:mockito-all:jar:1.9.5:test
[DEBUG]    org.powermock:powermock-module-junit4:jar:1.5.5:test
[DEBUG]       org.powermock:powermock-module-junit4-common:jar:1.5.5:test
[DEBUG]          org.powermock:powermock-core:jar:1.5.5:test
[DEBUG]             org.javassist:javassist:jar:3.18.1-GA:test (version managed from 3.18.2-GA by org.springframework.boot:spring-boot-dependencies:1.1.4.RELEASE)
[DEBUG]          org.powermock:powermock-reflect:jar:1.5.5:test
[DEBUG]             org.objenesis:objenesis:jar:2.1:test
[DEBUG]    org.powermock:powermock-api-mockito:jar:1.5.5:test
[DEBUG]       org.powermock:powermock-api-support:jar:1.5.5:test

您可以在哪里看到javassist and httpcore某些传递依赖项会删除版本,并且javax.activation版本提高一。

当多个项目依赖项依赖于同一库并且已定义对该库的不同版本的依赖项时,就会发生这种情况。这可能很烦人,因为通常您无法更改父 POM 或其依赖项影响传递依赖项版本的方式。

调解规则自Maven 文档 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html如下面所述:

依赖调解 - 这决定了依赖的版本 当遇到工件的多个版本时将使用。 目前,Maven 2.0仅支持使用“最近的定义” 这意味着它将使用最接近的依赖项的版本 您的项目位于依赖关系树中。您始终可以保证 通过在项目的 POM 中显式声明它来确定版本。请注意,如果 两个依赖版本在依赖树中处于相同的深度, 在 Maven 2.0.8 之前,还没有定义哪一个会获胜,但是自从 Maven 2.0.9 声明中的顺序很重要:第一个 宣言获胜。

“最近的定义”意味着使用的版本将是依赖树中最接近您的项目的版本,例如。如果 A、B 和 C 的依赖关系定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,那么构建 A 时将使用 D 1.0,因为从 A 到 D 经过 E 的路径较短。您可以显式添加一个 A 中对 D 2.0 的依赖以强制使用 D 2.0

但是,您可以做的是自己管理依赖项版本。这称为依赖管理,如相同文档所述:

依赖管理 - 这允许项目作者直接 指定遇到工件时要使用的工件版本 在传递依赖项或没有版本的依赖项中 已指定。在上一节的示例中,依赖项 直接添加到 A,即使它没有被 A 直接使用。 相反,A 可以将 D 作为依赖项包含在其 dependencyManagement 中 部分并直接控制在以下情况下使用 D 的版本: 它曾经被引用过。

因此,您只需添加:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>bar</groupId>
      <artifactId>foo</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
</dependencyManagement>

到您自己的 POM 中,这将始终覆盖通过依赖项中介为您的传递依赖项定义的任何版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Maven 中调试工件替换 的相关文章

随机推荐

  • cspack 行为与 msbuild 不同

    使用 Visual Studio 2012 Azure SDK 2 1 我试图找出创建 csx 文件夹以在 azure 模拟器中运行的最佳方法 我的理解是 在打包 Azure 项目之前 不会创建 csx 文件夹 我可以从 Visual St
  • 无法在 iOS 上使用自定义 @protocol

    注意 以下是使用启用了自动引用计数 ARC 的 iOS 我认为 ARC 可能与它不起作用有很大关系 因为这是根据我通过谷歌找到的示例设置的 我正在尝试创建一个协议来通知委托用户从 UITableView 选择的文件名 文件列表视图控制器 h
  • 离子搜索栏搜索不适用于 cypress {enter}

    我有一个 Ionic 6 应用程序 我正在使用 cypress 9 3 1 对其进行测试 在我的应用程序中 我使用像这样的离子搜索栏
  • 插入...值(SELECT ... FROM ...)

    我在尝试着INSERT INTO使用另一个表的输入的表 尽管这对于许多数据库引擎来说是完全可行的 但我似乎总是很难记住正确的语法SQL当天的发动机 MySQL http en wikipedia org wiki MySQL Oracle
  • WPF DPI 问题

    我开发了一个应用程序 在我的计算机上看起来很棒 但当我将其安装到具有不同分辨率和 DPI 设置的其他计算机上时 它看起来很糟糕 控件相互重叠 这真是太痛苦了 有人对如何避免这种情况有什么建议吗 Windows 无法知道屏幕的本机 DPI 每
  • Python3 - 无法读取 docx、odt 文件 - UnicodeDecodeError:“utf-8”编解码器无法解码位置 10 中的字节 0xea:无效的连续字节

    我正在尝试将大 docx 文件拆分为小文件 为此 当读取文件时python3 6使用以下代码 with open h docx r as f a f read 它抛出这个错误 Traceback most recent call last
  • Linux 中的沙箱

    我想创建一个 Web 应用程序 允许用户上传一些 C 代码 并查看其执行结果 代码将在服务器上编译 用户不受信任 这显然会带来巨大的安全隐患 所以我需要为应用程序创建某种沙箱 在最基本的层面上 我想将对文件系统的访问限制为某些指定的目录 我
  • Spring JPA 中的 @Entity 是什么?

    具体来说 我指的是javax persistence Entity 根据我将鼠标悬停在上面时显示的文档 在 VS Code 中它指出 指定该类是一个实体 该注解适用于 实体类 对于 Spring JPA 来说 类是实体意味着什么 Entit
  • GetComInterfaceForObject 是否固定对象?

    使用 GetComInterfaceForObject 并将返回的 IntPtr 传递给非托管代码是否会阻止托管对象在内存中移动 或者 clr 是否以某种方式维护该 ptr 请注意 非托管代码将在程序的生命周期内使用它 并且我需要确保托管对
  • 在单个测试类中测试接口的多个实现

    我需要通过班级级别的测试数据但是Theory and InlineData属性只能用在方法上 public class ContainerTests TestFixture private IContainer container publ
  • 在 GPU 上预加载整个数据集以训练 Keras 模型

    我有一个特定的情况 其中网络相对较小 为了收敛和泛化问题 我应该保持较小的批量大小 例如 256 这导致每个时期要处理数百个批量 不幸的是 在这种情况下 批量 加载和损失计算成为瓶颈 如timeline工具告诉我 在 TensorFlow
  • spring可以支持多应用共享成员资格吗?

    spring 框架是否支持共享公共用户群的多个应用程序 例如2 个独立的 Web 应用程序以某种方式连接到单个数据库以获取用户相关信息 用户名 密码 甚至角色 这个想法是这样的 类似于ASP NET 会员资格 http msdn micro
  • 图像隐写术抵御各种攻击的最佳实践是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对此真的很好奇 因为现在每个频道都可以以某种方式修改或压缩图像 这可以被视为对隐写术的攻击 我们可以将隐写术分为两种基本类型 第一种在图像的空
  • ClassNotFound launchig 地图活动在 Android 库中声明

    当尝试启动从 MapActivity 派生并在 Android 库项目中声明的活动 TestLocationActivity 时 我收到此异常 09 08 09 29 45 357 ERROR AndroidRuntime 7502 jav
  • 是否可以更改Matlab绘图功能中的标记? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 matlab 绘图函数来创建绘图 然而 可用的标记是有限的 例如 plot x y o 将用圆形标记绘制 但是 如果我想要带有箭头符号或字母的标记 这是不可能的 有谁知道有什么方法可以做到这一点
  • Excel VBA 调试:循环不搜索整个范围

    我编写了一个基本宏来搜索范围 在一张纸中 然后根据保存选择值的第三张纸复制所选单元格 到另一张纸 我已经使用了 i x to y 的循环 但看起来宏正在跳过一些行 即 如果第 1 行到第 4 行有 4 个要复制的有效值 则宏仅复制第 2 行
  • 如何拥有连续的 Firebase 云函数来获取连续的数据流?

    我需要使用 Twitter Stream API 将推文数据流式传输到我的 firebase 云函数 如下所示 client stream statuses filter params stream gt stream on data tw
  • 为什么 .NET JIT 编译器决定不内联或优化对没有副作用的空静态方法的调用?

    我认为我观察到 NET JIT 编译器没有内联或优化对没有副作用的空静态方法的调用 考虑到一些定制的在线资源 这有点令人惊讶 我的环境是 x64 Windows 8 1 NET Framework 4 5 上的 Visual Studio
  • 从posenet提取关键点到json文件?

    我正在研究posenet的张量流实现来实时进行姿态估计 如果可能的话还可以在离线模式下进行 我正在研究以下存储库 https github com tensorflow tfjs models tree master posenet htt
  • 如何在 Maven 中调试工件替换

    我有一个父项目包含十几个子项目 其中一个子项目使用org apache httpcomponents httpclient jar 4 3 5 这取决于org apache httpcomponents httpcore jar 4 3 2