我们目前正在开发Grails插件,该插件旨在成为多个不同应用程序的共享库。这个插件管理GORM和缓存,因此,它包括hibernate插件和缓存以及cache-ehcache插件。 Hibernate和cache-ehcache插件都希望导入ehcache-core jar依赖项,但具有不同的版本。我想要的ehcache-core版本是cache-ehcache插件中的版本,所以我已经像我这样配置了BuildConfig.groovy:
compile(':hibernate:3.6.10.10', { excludes 'ehcache-core' })
compile ':cache:1.1.8'
compile ":cache-ehcache:1.0.4"
在此插件中运行测试时,一切正常。但是,一旦我将这个插件包含在我的一个真实应用程序中,就会忽略excludes指令,并且对hibernate插件的传递依赖性开始引入ehcache-core。拥有两个版本的ehcache-core打破了许多不同的方面。
我已经检查了我的应用程序的grails依赖项报告,它显示了我的应用程序的依赖链 - >我的实用程序插件 - > hibernate插件 - > ehcache-core完好无损。在插件本身上运行的相同依赖性报告只指向hibernate插件,然后停止而不依赖于ehcache-core。
在运行插件时,有任何关于为什么依赖项排除有效的想法,但在运行依赖于插件的应用程序时却没有?
答案 0 :(得分:0)
这是由于对Maven / Aether依赖关系管理器库的更改。它比Ivy少了很多,而且速度明显更快,但却缺少我们很多人习惯的很多功能。一个简单的解决方法是切换回常春藤解析器。您只需要在发布时为插件执行此操作,但不一定在使用它们时,因为您需要一个已排除的.pom文件,其中列出了排除项,因此使用依赖项管理器知道要忽略的内容。如果你使用Aether,.pom文件只包含依赖项。
编辑:我专注于pom文件的正确性,或者这样的排除项应该有用(虽然它最好有正确的poms而不必强迫每个用户在他们的结尾修复它。)问题可能是您的群组或名称不同(例如,"缓存"与#34; ehcache"),然后他们无法驱逐/排除另一个。或者jar可能来自不同的依赖,并且它们的排除不是全局的。可能有一种设置全局排除的方法,但我不知道其中的一个,而且文档中没有任何内容。