当前位置: 首页 > 面试题库 >

Proguard-找不到常见的超类/ java.lang.VerifyError

解阳泽
2023-03-14
问题内容

我们正在开发一个桌面应用程序。使用以下配置标志在代码上运行ProGuard(版本5.3.3)时:

-dontoptimize
-allowaccessmodification
-dontusemixedcaseclassnames
-dontwarn

Proguard出现以下错误:

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文件时,我们将收到以下错误:

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可以避免这种情况。

如果可能,我们希望避免使用这些“不验证”标志。

注意:即使添加时也会发生构建错误

-dontobfuscate
-dontshrink

问题答案:

您正在指定-dontwarn用于禁止显示有关未解析引用的警告的选项。这可能在处理代码时导致问题。ProGuard需要这些参考,例如在预验证步骤中。该错误确实表明输入不包含所有必需的依赖项:ImmutableListUnmodifiableIterator缺少一些常见的超类或接口。对于桌面应用程序,应检查是否指定了具有所有必需类的Java运行时jar:

-libraryjars <java.home>/lib/rt.jar

请参阅ProGuard手册>故障排除>
警告:找不到超类或接口



 类似资料:
  • 问题内容: 我从这篇博客文章中获得了帮助: 但是我发现com.mysql.jdbc.driver类未找到异常。那篇博客文章的不同之处在于,在我的案例中,他们尝试连接到mysql而不是MS SQL。到目前为止,这是我的代码:package com.example.dbtry; 请告诉我我在做什么错。我还在清单中添加了对Internet的许可。 问题答案: 从以下位置下载jar:http://www.

  • 我对Java和Netbeans平台编程非常熟悉,我在10个Netbeans API(文件系统)的示例中遇到了这个非常奇怪的问题。我使用的是Ubuntu 14.10,Java JDK 8,Netbeans 8.0.1 我想在点击菜单元素后在swing消息框中显示一些数据。导入很好,dep库很好,所有编译都很好。但当我点击我的超级菜单项时,我有例外: 我试图导入所有javax.spring.*包,但它

  • 这个问题可能被很多人问过,但是,它有点不同。我们有一个二叉树。给你两个节点p&q。我们得找到最不常见的父母。但是您没有指向根的根节点指针。为您提供了两个内置函数,它们是: 如果节点c实际上是root,那么parentNode函数将返回值。使用这些函数,我们必须找到树中最不常见的父树。

  • 对于一个项目,我试图实现JSCSSMergeServlet servlet。 在完全按照说明并通过Maven启动Jetty之后 我得到一个错误的说法: 是否有一些其他文件我需要修改,以便使这个启动和运行?

  • 我试图用依赖项混淆jar(尽管如果我将常规的单个jar设置为infle,同样的问题也会影响)。 我使用的是Java8,但我必须使用更新版本的Proguard和Proguard Maven插件,因为它涵盖了一些来自更高版本的jar依赖项(否则我会遇到“不支持的主要-次要版本”问题)。 当执行“mvn clean install”时,执行该步骤,但我得到一个“在pluginArtifacts中找不到p

  • 我正在将一个java项目从Windows迁移到macOS 10.13。6(塞拉利昂高地)。我想使用ProGuard,由ant脚本触发。在Windows上,我添加了rt.jar作为ProGuard的输入。我了解到macOS上的等价物应该是类。jar,例如在 在我的系统上,在/system/Library/Frameworks/JavaVM中。框架/版本有“当前”和“A”文件夹,没有类。任何一个下面都