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

如何使用shadowJar gradle插件而不是maven发布将胖JAR发布到JitPack

无法为 gradle 任务设置类型 shadowJar

无法在 Intellij 中为 Gradle 导入 ShadowJar 插件