- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用 maven-enforcer-plugin 来检查依赖收敛问题。典型的输出是:
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.DependencyConvergence failed
with message:
Failed while enforcing releasability the error(s) are [
Dependency convergence error for junit:junit:3.8.1 paths to dependency are:
+-foo:bar:1.0-SNAPSHOT
+-ca.juliusdavies:not-yet-commons-ssl:0.3.9
+-commons-httpclient:commons-httpclient:3.0
+-junit:junit:3.8.1
and
+-foo:bar:1.0-SNAPSHOT
+-junit:junit:4.11
]
看到这条消息,我通常会通过排除传递依赖来“解决”它,例如
<dependency>
<groupId>ca.juliusdavies</groupId>
<artifactId>not-yet-commons-ssl</artifactId>
<version>0.3.9</version>
<exclusions>
<!-- This artifact links to another artifact which stupidly includes
junit in compile scope -->
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
我想了解这是否真的是一种修复以及以这种方式排除库所涉及的风险。在我看来:
只要我选择使用较新的版本,“修复”通常是安全的。这依赖于库作者保持向后兼容性。
通常对 Maven 构建没有影响(因为更接近的定义获胜),但是通过排除依赖项,我告诉 Maven 我知道这个问题,从而安抚了 maven-enforcer-plugin。
我的想法是否正确,是否有其他方法可以处理此问题?我对关注一般情况的答案感兴趣 - 我意识到上面的 junit
示例有点奇怪。
最佳答案
我们都同意 JUnit 永远不应该设置为 test
以外的其他范围。一般来说,我认为除了排除不需要的依赖之外,没有其他解决方案,所以我们都同意你这样做是正确的。
一个简单的案例:
正如 Andreas Krueger 所说,版本可能存在风险(我实际上遇到过)。假设项目的依赖项如下:
+-foo:bar:1.0-SNAPSHOT
+-group1:projectA:2.0
+-group2:projectB:3.8.1
+-group2:projectB:4.11
请注意,这只是对您的情况的简化。看到这个依赖树,你会排除 projectA 给出的依赖 projectB :
<dependency>
<groupId>group1</groupId>
<artifactId>projectA</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>group2</groupId>
<artifactId>projectB</artifactId>
</exclusion>
</exclusions>
</dependency>
使用 maven 打包项目后,剩余的依赖项将是 group2-someProjectB-4.11.jar,版本 4.11 而不是 3.8.1。一切都会好起来的,项目会运行而不会遇到任何问题。
然后,过了一会儿,假设您决定升级到项目 A 的下一个版本,即 3.0 版,它添加了新的强大功能:
<dependency>
<groupId>group1</groupId>
<artifactId>projectA</artifactId>
<version>3.0</version>
<exclusions>
<exclusion>
<groupId>group2</groupId>
<artifactId>projectB</artifactId>
</exclusion>
</exclusions>
</dependency>
问题是你还不知道 projectA 3.0 版也已将其依赖项 projectB 升级到 5.0 版:
+-foo:bar:1.0-SNAPSHOT
+-group1:projectA:3.0
+-group2:projectB:5.0
+-group2:projectB:4.11
在这种情况下,您刚才所做的排除会排除 projectB 版本 5.0。
但是,projectA 3.0 版需要对 project B 5.0 版进行改进。由于排除,使用 maven 打包项目后,剩余的依赖项将是 group2-someProjectB-4.11.jar,版本 4.11 而不是 5.0。在您使用 projectA 的任何新功能时,程序将无法正常运行。
解决方案是什么?
我在一个 Java-EE 项目中遇到了这个问题。
一个团队开发了数据库服务。他们将其打包为 projectA。每次更新服务时,他们还会更新一个文件,其中列出了所有当前依赖项和当前版本。
ProjectA 是我正在处理的 Java-EE 项目的依赖项。每次服务团队更新 ProjectA 时,我也会检查版本的更新。
事实上,排除一个依赖并没有什么坏处。但是每次你更新一个已经设置了排除的依赖时,你必须检查:
我猜 maven 排除就像菜刀。它很锋利,可以毫不费力地切蔬菜,但在处理时需要小心......
关于java - 解决Maven依赖收敛问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16100315/
我有几个关于我的遗传算法和整体 GA 的问题。 我创建了一个 GA,当给定一条曲线时,它会尝试找出产生这条曲线的函数。 例子如下积分 {{-2, 4},{-1, 1},{0, 0},{1, 1},{2
我正在尝试编写一个 GA 来解决以下难题... 二进制编码(我认为)非常有效。每件作品可以是: 原始向上或翻转的方式 - 1 位 旋转 0(即无)、90、180 或 270 度 - 2 位 在位置 (
我正在编写一个小代码(顺序)来计算适度数据集的网页排名(尽管并非完全微不足道)。 算法是这样的: while ( not converged ) { // Do a bunch of thing
我正在尝试检测长时间序列中的微事件。为此,我将训练一个 LSTM 网络。 数据。每个时间样本的输入是 11 个不同的特征,经过一定程度的标准化以适合 0-1。输出将是两个类之一。 批处理。由于巨大类别
我试图通过使用 optim 函数在 R 中找到最佳 GARCH 模型的参数。但是,我的值(value)观会变得很高,这是没有意义的。我在 MATLAB 中使用 fminsearch 实现了类似的算法,
我运行了 20 倍 cv.glmnet 套索模型以获得 lambda 的“最佳”值。但是,当我尝试重现 glmnet() 的结果时,我收到一条错误消息: Warning messages: 1: fr
我在 dymola 中构建了一个模型。虽然在初始化过程中出现了一些错误,但最终还是计算成功了。 模型收敛成功后,我尝试使用“在模型中保存起始值”选项将正确的迭代变量 strat 值存储到模型中,以便模
我有一个分层 Logit,可以随着时间的推移进行观察。正在关注Carter 2010 ,我添加了时间、时间^2 和时间^3 术语。在添加时间变量之前,模型会使用 Metropolis 或 NUTS 进
再次感谢您花时间阅读这篇文章。 我知道这个问题已经被问了很多,而且我已经检查了很多关于这个问题的帖子:然而,我对使用反向传播的成功 XOR 学习的探索仍未完成。 我按照建议尝试调整学习率、动量、有/无
我是一名优秀的程序员,十分优秀!