配置 Gradle Shadow 插件以创建仅具有一个重定位依赖项的库 jar

Configure Gradle Shadow plugin to create library jar with only one relocated dependency

我的用例:

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

我认为这是使用此插件的主要原因之一,重新定位依赖项但仍像以前一样为您提供作为普通库的项目。对我来说,配置我的用例并不是很直观。我只想启用重定位而不创建 fatjar。

My example project 按预期工作,但我不喜欢我需要将依赖项定义两次 shadowimplementation.

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

implementation => 用于编译项目本身的依赖项,例如在你 IDE.

你知道更好的方法吗?

更新:

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

如果你想创建一个只有一个特定依赖项的库 jar 需要重新定位,而你的项目的其他依赖项仍在发布的 pom 中,因为 how the Shadow plugin works

所以我更新了我的示例项目并找到了 2 个可能的解决方案来解决缺少传递依赖项的问题(我的问题中的 siehe 更新块)。

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

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

我更喜欢方案一