【问题标题】:Duplicate zip entry when creating an obfuscated application jar using proguard with gradle使用带有 gradle 的 proguard 创建混淆的应用程序 jar 时重复的 zip 条目
【发布时间】:2019-08-06 16:04:24
【问题描述】:

Java 应用程序本身不包含第三方库依赖项。如果我删除 obfuscate 任务和 jar.finalizedBy(project.tasks.obfuscate) 行,标准 jar 将构建并且可以运行。

错误..

* What went wrong:
Execution failed for task ':obfuscate'.
> java.io.IOException: Can't write [/Users/rob/git/repo/build/libs/tool.out.jar] (Can't read [/Users/rob/git/repo/build/libs/tool.jar] (Duplicate zip entry [com/example/cli/j.class == tool.jar:com/example/cli/HelperUtils$5.class]))

build.gradle ..

task obfuscate(type: proguard.gradle.ProGuardTask) {
    configuration 'proguard.txt'

  injars "build/libs/tool.jar"
  outjars "build/libs/tool.out.jar"
  libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
}

jar {
    archiveName = "tool.jar"
    from sourceSets.main.output.classesDir
    include '**/cli/*.class'
    manifest {
        attributes 'Main-Class': 'com.example.cli.Tool'
    }
}
jar.finalizedBy(project.tasks.obfuscate)

proguard.txt ..

-keep public class com.example.cli.* {*;}

应用程序包含 3 个 Java 类文件..

com.example.cli.Tool (which contains the main)
com.example.cli.HelperUtils
com.example.cli.CustomEnums

【问题讨论】:

  • 仔细检查 tool.jar 以确保它没有重复的条目。注意:许多工具允许并隐藏重复条目。您可能需要使用十六进制编辑器查看 jar 以查看重复条目。
  • 当您说“重复条目”时,您是指定义了两次的自定义类吗?
  • 重复条目将是使用相同条目名称存储两次的 JAR 的任何条目。 (“存储”而不是“定义”,因为类资源存储在 JAR 文件中,而类是在类加载期间定义的。JAR 可能会存储两次具有相同名称的类资源,但类加载器应该只定义一个特定的命名类最多一次。)
  • 可能存在重复条目,具体取决于用于创建 JAR 的工具或 API。许多工具允许将新条目添加到现有 JAR 中,而无需确保新条目与现有条目不重复。
  • 不幸的是,用于查看 jar 的工具通常会忽略重复的条目。通常,将生成单个条目表,并且重复条目将覆盖先前存储的条目。您必须使用十六进制编辑器并查找重复名称,或者执行诸如提取 jar 内容并从工具输出中查找覆盖警告之类的操作。

标签: java gradle proguard obfuscation


【解决方案1】:

jar 任务中添加了以下内容:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    ..
}

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2014-11-22
    • 2011-09-26
    • 2017-11-06
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多