Gradle 和 Shadow 插件 - 在 shadowJar 任务之后将附加文件(.jar 文件)复制到最终 jar

Dmi*_*mov 6 gradle gradle-shadow-plugin gradle-plugin gradle-task

问题描述
我正在使用 Gradle Shade 插件,一切正常,并将资源文件复制到最终的 jar。但是,正如文档所说,它不能包含其他.jar文件作为资源,因为它无法将它们与依赖项区分开来。它不是解压它们。

我想要做什么
我想将.jar文件tools夹(build.gradle位于my 旁边)中的额外文件复制到任务最终jar生成的文件中shadowJar

问题
如何扩展任务 ( shadowJar) 以将其他文件复制到生成的 jar 文件中。

tww*_*wwt 0

Gradle Shadow 插件文档的Embedding Jar Files Inside Your Shadow Jar部分对此进行了解答:

[...] Shadow 无法区分配置为依赖项的 jar 文件和资源文件夹中包含的 jar 文件。这意味着在资源目录中找到的任何 jar 都将像任何其他依赖项一样合并到影子 jar 中。如果您打算将 jar 嵌入其中,则必须在影子任务开始之前重命名该 jar,使其不以 .jar 结尾。

不幸的是,这既适用于作为依赖项配置一部分的 JAR ,也适用于使用from复制规范复制 JAR(这有效,因为shadowJar任务扩展了jar任务;而任务又是复制任务,因此支持复制规范)。

因此,只能通过重命名 JAR 来嵌入它。如果必须.jar在 Uber JAR 中命名,我认为唯一的选择是三步解决方法:

  1. 创建 Uber JAR 并通过重命名嵌入 JAR;例如,使用后缀*.zip.
shadowJar
{
    from("${dirThatContainsSomeJARs}")
    {
        include '*.jar'
        rename '(.+).jar', '$1.zip'
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 解压 Uber JAR 并将所有已嵌入的 JAR 重命名*.zip*.jar.
  2. 使用jarzip任务再次重新打包所有内容。