从eclipse类路径中排除项目引用的传递依赖性的问题

时间:2015-01-15 18:19:37

标签: java eclipse gradle dependency-management gradle-eclipse

我的eclipse工作区里有几个gradle项目。为了简单起见,我只对它们中的两个感兴趣,让我们只使用A和B.这就是它。

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

validation-api jar的正确版本最终出现在B的类路径中,但问题是Gradle IDE插件将项目(':A')依赖项更改为项目引用,Eclipse似乎给出了项目参考优先于外部jar。所以旧罐子是扩展的首选。

我尝试在B的build.gradle中添加{ exclude module: 'validation-api' }以获取对A的依赖性,该依赖于'gradle dependencies'的输出,但是由于Eclipse只是将其作为项目引用,它赢得了'排除罐子,问题仍然存在。

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

我设法通过从gradle缓存中明确地包含对jar的正确版本的引用,然后将其移到Gradle Classpath Container上方以便eclipse首先看到该版本来解决这个问题。

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

最糟糕的情况是,如果它的行为本身比Eclipse-Gradle集成更好,我可能会切换到IntelliJ?

1 个答案:

答案 0 :(得分:1)

这种传递依赖问题是Gradle Eclipse集成的长期问题(在STS工具中以及Gradle的Eclipse插件中的命令行生成的.classpath元数据。问题是Eclipse计算传递类路径的方式。

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

第一个解决方案是一个错误修复程序,它会更改项目依赖项的类路径顺序,以便它们不再是首选' over jar dependencies PR-74。要获得此修复,您可能需要从快照更新站点安装gradle工具,因为修复程序在3.6.3之后进入。

此解决方案无法解决实际问题(您仍然在类路径中存在错误的内容)但只是使其不太可能在您的项目中造成实际问题。

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

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

要启用此功能,请转到" Window>>偏好设置>>摇篮"并启用复选框"使用自定义工具模型"。