【发布时间】: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