Proguard - 找不到常见的超类/ java.lang.VerifyError [英] Proguard - Can't find common super class / java.lang.VerifyError
问题描述
我们正在开发桌面应用程序。使用以下配置标志在代码上运行ProGuard(版本5.3.3)时:
We are developing a desktop application. When running ProGuard (version 5.3.3) on the code using the following configuration flags:
-dontoptimize
-allowaccessmodification
-dontusemixedcaseclassnames
-dontwarn
Proguard给出以下错误:
Proguard gives the following error:
Unexpected error while performing partial evaluation:
Class = [com/code/backend/e/b/b]
Method = [b(Ljava/lang/String;)Ljava/nio/file/Path;]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes))
Unexpected error while preverifying:
Class = [com/code/backend/e/b/b]
Method = [b(Ljava/lang/String;)Ljava/nio/file/Path;]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes))
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task 'proguard'.
> Can't find common super class of [com/google/common/collect/ImmutableList] (with 2 known super classes) and [com/google/common/collect/UnmodifiableIterator] (with 1 known super classes)
如果将-dontpreverify标志添加到配置中,则构建将成功。但是,当运行jar文件时,我们会收到以下错误:
If the flag -dontpreverify is added to the configuration the build will succeed. However when running the jar-file we then get the following error:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 11
Exception Details:
Location:
com/code/code2/MainWindow.b(Lcom/code/code2/ClientAPIProtos$SoftwareStatus;)V @1: ifnull
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: 2bc6 000a 2ab4 00bc c700 04b1 2bb2 00a4
0x0000010: a500 0a2b b800 f599 0018 2ab4 00bc b601
0x0000020: 9299 0020 2ab4 00bc 03b6 0193 a700 152a
0x0000030: b400 bcb6 0192 9a00 0b2a b400 bc04 b601
0x0000040: 932b b800 f699 0012 1225 4db8 0138 4e2a
0x0000050: 04b5 00c8 a700 0f12 1e4d b801 3a4e 2a03
0x0000060: b500 c82a b400 bcb6 0191 3a04 1904 c600
0x0000070: 0c2c 1904 b601 799a 000b 2ab4 00bc 2cb6
0x0000080: 0195 2ab4 00bc b601 903a 0519 05c6 0009
0x0000090: 2d19 05a5 000b 2ab4 00bc 2db6 0194 b1
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
使用JVM标志-noverify可以避免这种情况。阅读主题:
Which can be avoided by using the JVM flag -noverify. Reading the thread:
如果可能,我们希望避免使用这些无验证标记。
We would like to avoid these 'no verification' flags if possible.
注意:即使添加
-dontobfuscate
-dontshrink
推荐答案
你指的是选项 -dontwarn
禁止有关未解析引用的警告。这可能会在处理代码时导致问题。 ProGuard需要这些参考,例如在预验证步骤中。该错误确实表明输入不包含所有必需的依赖项: ImmutableList
和 UnmodifiableIterator
的一些常见超类或接口不见了。对于桌面应用程序,您应检查是否指定了包含所有必需类的Java运行时jar:
You're specifying the option -dontwarn
to suppress warnings about unresolved references. This can lead to problems while processing the code. ProGuard needs those references, e.g. in the preverification step. The error indeed suggests that the input doesn't contain all necessary dependencies: some common superclass or interface of ImmutableList
and UnmodifiableIterator
is missing. For a desktop application, you should check that you're specifying a Java runtime jar with all the necessary classes:
-libraryjars <java.home>/lib/rt.jar
请参阅ProGuard手册>故障排除> 警告:找不到超类或界面
See the ProGuard manual > Troubleshooting > Warning: can't find superclass or interface
这篇关于Proguard - 找不到常见的超类/ java.lang.VerifyError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!