问题描述:
我正在使用 Gradle Shade 插件,一切正常,并将资源文件复制到最终的 jar 中。但是,正如文档所说,它不能将其他.jar
文件作为资源包含在内,因为它无法将它们与依赖项区分开来。它会解开它们而不是。
我想做什么:
我想将文件夹(位于我旁边)中的额外.jar
文件复制到任务生成的最终文件中。tools
build.gradle
jar
shadowJar
问题:
如何扩展任务(shadowJar
)以将其他文件复制到生成的 jar 文件中。
问题描述:
我正在使用 Gradle Shade 插件,一切正常,并将资源文件复制到最终的 jar 中。但是,正如文档所说,它不能将其他.jar
文件作为资源包含在内,因为它无法将它们与依赖项区分开来。它会解开它们而不是。
我想做什么:
我想将文件夹(位于我旁边)中的额外.jar
文件复制到任务生成的最终文件中。tools
build.gradle
jar
shadowJar
问题:
如何扩展任务(shadowJar
)以将其他文件复制到生成的 jar 文件中。
这在 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 中命名,我认为唯一的选择是三步解决方法:
*.zip
.shadowJar
{
from("${dirThatContainsSomeJARs}")
{
include '*.jar'
rename '(.+).jar', '$1.zip'
}
}
*.zip
为*.jar
.jar
orzip
任务重新打包所有内容。