错误:找不到常见的超类

Posted

技术标签:

【中文标题】错误:找不到常见的超类【英文标题】:Error: Can't find common super class of 【发布时间】:2011-02-05 04:52:58 【问题描述】:

我正在尝试使用 Proguard 处理 MS Windows 桌面应用程序(使用 Eclipse 提供的 SWT 库的 Java 6 SE)。我收到以下严重错误:

Unexpected error while performing partial evaluation:
Class = [org/eclipse/swt/widgets/DateTime]
Method = [<init>(Lorg/eclipse/swt/widgets/Composite;I)V]
Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR])
Error: Can't find common super class of [java/lang/StringBuffer] and [org/eclipse/swt/internal/win32/TCHAR]
----------------------------

当我尝试用谷歌搜索该错误时,它只出现在整个网络上的两个位置,这让我非常惊讶。 我是使用 Proguard 和 Java 代码优化工具的新手。 任何如何解决此问题的想法和建议将不胜感激。提前致谢。

以上错误现已修复,使用“-dontskipnonpubliclibraryclasses”

--最终更新:

我现在仍然收到另一个错误。 现在整个输出如下:

D:\eclipse_projs\java_obfuscate\gci>gci.bat
ProGuard, version 4.4
Reading program jar [D:\eclipse_projs\java_obfuscate\gci\gci.jar]
Reading library jar [D:\jre1.6.0_07\lib\rt.jar]
Unexpected error while evaluating instruction:
  Class       = [org/eclipse/swt/widgets/Synchronizer]
  Method      = [runAsyncMessages(Z)Z]
  Instruction = [60] aload_1 v1
  Exception   = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
Unexpected error while performing partial evaluation:
  Class       = [org/eclipse/swt/widgets/Synchronizer]
  Method      = [runAsyncMessages(Z)Z]
  Exception   = [java.lang.IllegalArgumentException] (Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue])
 Error: Value is not a reference value [proguard.evaluation.value.UnknownIntegerValue]

D:\eclipse_projs\java_obfuscate\gci>

这是一个我无法确定的问题:(任何帮助将不胜感激。

我使用的选项如下:

-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-optimizationpasses 3
-overloadaggressively
-repackageclasses ''
-allowaccessmodification
-dontnote

【问题讨论】:

如果您没有获得完整的堆栈跟踪,请将 -verbose 添加到命令行。 【参考方案1】:

尝试将选项 -dontskipnonpubliclibraryclasses 添加到您的命令行。

来自Proguard Manual:

限制

为了提高效率, ProGuard 总是忽略任何私有或 打包可见的库类,而 阅读图书馆的罐子。如果其中任何一个 由公共图书馆扩展 类,然后再次扩展 输入类,ProGuard 会抱怨 它找不到它们。在这种情况下, 你必须使用 -dontskipnonpubliclibraryclasses 选项,甚至可能 -dontskipnonpubliclibraryclassmembers 选项。图形用户界面 有这些设置的复选框。

【讨论】:

是的,我做到了,现在已经解决了这些错误。不幸的是,其他错误现在正在增加:我会将它们添加到我上面的帖子中,作为更新 是的,谢谢 JRL,我正在尝试命令行版本来开始工作,因为它对我来说更方便。【参考方案2】:

我的应用程序存在问题,具体取决于其他各种项目。我尝试了列出的解决方案,但没有一个有帮助。根据测试,收缩和预验证步骤运行正确,优化抛出错误:

> java.io.IOException: java.lang.IllegalArgumentException: Can't find common super class of [java/io/File] (with 2 known super classes) and [org/antlr/v4/runtime/tree/gui/TreeViewer] (with 1 known super classes)

我尝试保留(-keep 选项)这两个类都没有成功。 根据其他线程,我发现最小的解决方案是禁用变量优化:

-optimizations !code/allocation/variable

这让我可以成功编译,但也有缺点。

【讨论】:

【参考方案3】:

尝试删除-dontnote 选项。您可能有没有收到警告的重复定义,或者您可能忽略了警告。

【讨论】:

LOL :D 我实际上忽略了警告,这有多糟糕?现在我将尝试在 -keepclassmembers 中添加警告,我会写回我的进度。 不,实际上我目前没有任何警告。我只有笔记,当我输入 -dontnote 时,我仍然得到一个错误,这对我来说是无法理解的。我确实将原始问题中的所有输出粘贴为 --final update,见上文。【参考方案4】:

我遇到了同样的问题,但没有尝试指定 -dontskipnonpubliclibraryclasses 或任何其他选项来解决。我的问题发生在java.lang.StringBuffer 类上,这很奇怪。整个项目都在使用StringBuffer 类,并且在其他任何地方都没有发生错误。

为了解决这个问题,我所做的只是移动了StringBuffer 的范围。

旧代码 - 有错误:

function()
   if(condition)
       StringBuffer buffer = new StringBuffer();
       //additional code
   else if(condition)
       StringBuffer buffer = new StringBuffer();
       //additional code
   

新代码 - 没问题。

function()
    StringBuffer buffer = new StringBuffer();

       if(condition)

           //additional code
       else if(condition)

           //additional code
       
    

我感觉这与 ProGuard 以及它如何解析代码有关。

【讨论】:

您有没有找到其他解决方案?

以上是关于错误:找不到常见的超类的主要内容,如果未能解决你的问题,请参考以下文章

找不到“AFURLSessionManager”的接口声明,“AFHTTPSessionManager”的超类?

`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到

Python MainWindow 类找不到属性

JETTY,JDK11 发邮件 javax/activation/DataSource类找不到错误

RegistryKey与RegistryValue类找不到问题处理

RegistryKey与RegistryValue类找不到问题处理