为什么 gradle 在更新到 gradle 7.3.2 后生成 2 个 jar

Why is gradle generating 2 jars after update to gradle 7.3.2

我将 gradle 更新为 7.3.2 和影子插件:id“com.github.johnrengelman.shadow”版本“7.1.1”。 gradle 6 和旧版本的 shadow 1 在 运行 gradle 构建后生成了单个 fat jar。现在我得到 2 个罐子,1 个不包含其他库的罐子和一个名为“...-all.jar”的胖罐子。 在我的构建中,我有这一行:

build.dependsOn.add("shadowJar")

为什么会这样?如何在没有 -all 扩展名的情况下只获得 1 个胖罐?

有一点需要注意: 我不确定这是否是错误警告,但 IntelliJ 在“dependsOn”上显示以下警告:

No candidates found for method call build.dependsOn.
  myProject.myModule

将有两个 JAR:一个来自任务 jar,另一个来自 shadowJar。前者只包含您的源代码的字节码,而后者不仅包含字节码,还包含来自第三方的 JAR。

您在旧版本中得到了单个 JAR,因为这两个 JAR 的文件名相同。 shadowJar 生成的一个简单地覆盖了另一个。您可以在 ./gradlew build 期间继续检查其大小。我认为这种行为是 Shadow 插件中的一个错误,后来在较新的版本中修复了。我注意到它是因为它只发生在 Linux 中,而不是在 MacOS 中(或者在 MacOS 中不在 Linux 中,我只是不记得了)。此 JAR 覆盖确实影响了 Gradle 缓存机制。

您可以通过设置 archiveClassifier:

来更改输出名称
shadowJar {
   archiveClassifier.set('')
}

参考资料