配置GradleShadow插件以创建只有一个重新定位的依赖项的库jar



我的用例:

使用Gradle Shadow插件构建一个Java库,该库具有重新定位的Google Guice依赖项(可以是其他dep(,以避免下游项目中的依赖关系问题,但其他依赖关系保持原样。这意味着下游项目仍然通过Maven存储库获取这些依赖项,因为它们是在库pom中定义的。

我认为这是使用这个插件的主要原因之一,重新定位依赖项,但仍然像以前一样为您提供一个正常的库。对我来说,配置我的用例并不是很直观。我只想在不创建fatjar的情况下启用重定位。

我的示例项目按预期工作,但我不喜欢我需要将依赖项定义为shadowimplementation两次。

shadow=>依赖项作为运行时deps添加到已发布的pom中(参见代码(

实现=>用于编译项目本身的依赖项,例如在IDE中。

你知道更好的方法吗?

更新

我的示例项目中的配置适用于Guice依赖项,因为它按预期进行了重新定位,但缺少可传递的依赖项。当然,这导致了ClassNotFoundExection(在我的真实项目中(,因为Guice没有找到它们自己依赖的类。

如果您想创建一个只有一个特定依赖项需要重新定位的库jar,并且由于Shadow插件的工作方式,您的项目的其他依赖项仍在发布的pom中,则没有其他解决方案。

因此,我更新了我的示例项目,并找到了两个可能的解决方案来解决缺少传递依赖项的问题(参见我问题中的更新块(。

选项1:将所有可传递的依赖项(以及依赖项的依赖项(添加到shadowJar块:https://github.com/dacrome/gradle-shadow-plugin-example/tree/successful-config-option-1

选项2:仅将Guice的一级依赖项添加到依赖项块:https://github.com/dacrome/gradle-shadow-plugin-example/tree/successful-config-option-2

我更喜欢选项1。