java - 从 Eclipse 类路径中排除项目引用的传递依赖关系的问题

标签 java eclipse gradle dependency-management gradle-eclipse

我的 Eclipse 工作区中有几个 gradle 项目。为了简单起见,我只对其中的 2 个感兴趣,我们只使用 A 和 B。

所以我遇到的问题是项目 A 包含对 JBoss 的依赖,它引入了 javaxvalidation-api 1.0.0.GA,而项目 B 依赖于 javaxvalidation-api 1.1.0.Final 。由于 Gradle 本身首先使用较新的库来解决冲突,因此 B 在由 gradle 构建时很高兴。但 Eclipse 本身包含错误,这些错误在编辑时非常分散注意力。

validation-api jar 的正确版本最终出现在 B 的类路径中,但问题是 Gradle IDE 插件将项目(':A') 依赖项更改为项目引用,并且 Eclipse 似乎提供了项目引用优先于外部 jar。因此,通过扩展,旧 jar 是首选。

我尝试在 B 的 build.gradle 中添加 { except module: 'validation-api' } 以获取对 A 的依赖,该依赖根据 'gradle dependency' 的输出工作,但是由于 Eclipse 只是获取就使其成为项目引用而言,它不会排除该 jar,问题仍然存在。

另见 this question我尝试添加 { transitive = false } 并且发生了同样的事情。我认为即使是在那里提出的 hack 对我也不起作用,因为 .classpath 包含对 Gradle 容器的单个引用,所以没有什么可以删除的。

我已经成功地解决了这个问题,方法是显式地包含对 gradle 缓存中正确版本的 jar 的引用,然后将其移至 Gradle 类路径容器上方,以便 eclipse 首先看到该版本。

我的问题是:有没有更好/更通用的方法来做到这一点?最好是我可以提交源代码控制而不破坏其他人的构建或要求他们在某处手动修改路径或属性?还有另一个项目似乎有类似的问题,所以我可以在 build.gradle 文件中修复一些东西,那就太棒了。

最坏的情况,如果 IntelliJ 的表现比 Eclipse-Gradle 集成更好,我可能会切换到 IntelliJ?

最佳答案

这些类型的传递依赖问题是 Gradle Eclipse 集成中长期存在的问题(无论是在 STS 工具中,还是从 Gradle 的 Eclipse 插件命令行生成的 .classpath 元数据中。问题在于 Eclipse 计算传递类路径的方式。

直到最近我们才找到解决这个问题的合理方案。实际上,现在有两种解决方案,一种比另一种更好,但根据您的情况,您可能想使用其中一种。

第一个解决方案是一个错误修复,它更改了项目依赖项的类路径顺序,以便它们不再比 jar 依赖项“更受青睐”PR-74 。要获得此修复,您可能需要从快照更新站点安装 gradle 工具,因为该修复是在 3.6.3 之后进行的。

这个解决方案并不能解决真正的问题(类路径上仍然有“错误”的东西),只是使它不太可能在项目中引起真正的问题。

第二个解决方案是启用“自定义工具 API 模型”PR-55 STS 3.6.3 中引入。这有点实验性,仅适用于最新版本的 Gradle,至少是 1.12,但使用 2.x 可能更好。它也仅适用于启用了“依赖管理”的项目(如果未启用,您将使用由 Gradle 的 eclipse 插件生成的 .classpath,该插件与 STS 工具具有相同的“损坏”类路径问题)。

“自定义工具模型”原则上确实是更好的解决方案,因为它修复了 gradle 类路径映射到 eclipse 项目的方式,以便不再导出项目依赖项,并且考虑到依赖项冲突解决,每个项目都会获得自己的类路径。

要启用此功能,请转到“窗口>>首选项>>Gradle”并启用“使用自定义工具模型”复选框。

关于java - 从 Eclipse 类路径中排除项目引用的传递依赖关系的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27970326/

相关文章:

android - 如何知道依赖项来自哪个远程存储库?

android-studio - 使用 gradle 导入 GSON

java - Android 蓝牙 IOException 错误的文件号

java - 使用jni调用方法 : Bad JNI oop argument

Java 字符串操作/新字符串创建

android - 导出 Android 应用程序究竟有什么作用?

gradle - 我无法在 Intellij 中注册 Klaxon 依赖项

java - 如何在SparseArray容器中使用扩展类?

eclipse - 如何使用 Eclipse EGit 从 GIT 存储库创建新项目

java - Eclipse 调试器错误地显示 cjk 字符 - Java