Gradle ShadowJar 输出包含混淆和非混淆类
Posted
技术标签:
【中文标题】Gradle ShadowJar 输出包含混淆和非混淆类【英文标题】:Gradle ShadowJar output contains obfuscated and non-obfuscated classes 【发布时间】:2017-09-24 09:53:34 【问题描述】:在我的简单 gradle 构建中,我想同时使用 ShadowJar 和 ProGuard。我有found examples,其中 shadowJar 任务的输出是 proguard 的输入,它工作正常,但是在我的情况下,我更喜欢首先创建小的混淆 jar,在那里我很好地指定库依赖项并让 proguard 专注仅在我的代码上,然后我想将其传递给 shadowjar 插件以进行 fatjar 打包。
我的设置如下:
task obfuscate(type: proguard.gradle.ProGuardTask)
injars jar
outjars "build/libs/foo-$project.version-pg.jar"
...
shadowJar
from obfuscate
configurations = [project.configurations.embed]
shadowJar.dependsOn obfuscate
我的问题是 shadowJar 输出包含所有未混淆的库(很好)、我的混淆代码(很好)和我的未混淆代码。所以不知何故,原来的课程偷偷溜进来,我不明白这是怎么回事。我无法指定 shadowJar 将依赖项和 proguard 输出 jar 打包在一起。
你知道我的方法的问题在哪里吗?
【问题讨论】:
【参考方案1】:试试这个,对我有用:
task shadowJar2( type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar )
baseName = jar.baseName
from obfuscate
configurations = [project.configurations.embed]
classifier = 'shadow'
//version =
问题在于,除了混淆的 + 库 jar 之外,默认的 shadowJar 任务还需要您的“主”源集。通过定义您自己的自定义 'shadowJar2' 任务,您明确定义了您的源,在这种情况下,它只是 jars('obfuscate' + 'embed')而不是源集。
【讨论】:
我正在尝试实现类似的东西(只有 [部分] 我们自己的代码被混淆的胖 jar),并且在尝试您的建议时收到此错误消息:Could not get unknown property 'embed' for configuration container
。然后我尝试了compile
而不是embed
(这应该是Java项目的有效配置)并得到Execution failed for task ':obfuscate'. The output jar must be specified after an input jar, or it will be empty
以上是关于Gradle ShadowJar 输出包含混淆和非混淆类的主要内容,如果未能解决你的问题,请参考以下文章
如何将清单部分与 Gradle 和 shadowJar 合并
Gradle 和 Shadow 插件 - 在 shadowJar 任务之后将附加文件(.jar 文件)复制到最终 jar
如何在 Gradle 中使用带有混淆 jar 的 Launch4J