0

我在运行我的混淆 jar 时遇到问题,当我尝试运行它时收到“Java 虚拟机启动器”消息“发生 Java 异常”。(此错误是一个弹出窗口,而不是在命令行上)我尝试从命令行运行并从 jvm 控制台打印堆栈跟踪,但没有看到任何异常。

所以我做了一些故障排除:我禁用了收缩、混淆和优化,以便输出(应该)与输入相同。结果是输出 jar 比输入少几个 KB。我提取了两个 jar,反编译了 .class 文件,并比较了每个文件的源代码和 MANIFEST.MF,它们都是一样的*!

我正在使用 ProGuard 4.10、JDK 1.7.0_25 x64 和 Windows 8。我正在构建一个相当精细的 JavaFX 程序,并且我相信我正确配置了 ProGuard——但如果收缩、混淆和优化都被禁用,那将不再重要,正确的?以下是 ProGuard 给我的注释:

Note: duplicate definition of library class [netscape.javascript.JSException]
Note: duplicate definition of library class [netscape.javascript.JSObject]
Note: com.javafx.main.Main accesses a field 'HKEY_LOCAL_MACHINE' dynamically
Note: com.javafx.main.Main accesses a field 'HKEY_LOCAL_MACHINE' dynamically
Note: com.javafx.main.Main accesses a declared method 'reset()' dynamically
Note: com.javafx.main.Main$2 accesses a field 'ERROR_MESSAGE' dynamically

当我第一次尝试混淆时,我跳过了 com.javafx.main.** 但我仍然收到了这些消息。任何帮助将不胜感激。在 ProGuard 处理之前,我运行我的 jar 没有问题。谢谢。

*编辑:进行二进制比较时,清单文件不同(原始文件较长),但进行 ASCII 比较时,两个文件是相同的。所有其他文件完全相同。两个 MANIFEST.MF 文件之间的区别在于 PC 与 UNIX 换行符。

* EDIT2:我使用 -jar 选项运行文件,但确实得到了一个明确的异常!

java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

从 com.javafx.main.Main 这里是 ERROR_MESSAGE 和 HKEY_LOCAL_MACHINE 的使用:

int ERROR_MESSAGE = ERROR_MESSAGE_Field.getInt(null);

Method showMessageDialogMethod = jOptionPaneClass.getMethod("showMessageDialog", new Class[] { componentClass, Object.class, String.class, Integer.TYPE });

showMessageDialogMethod.invoke(null, new Object[] { null, this.val$string, "JavaFX Launcher Error", new Integer(ERROR_MESSAGE) });

...

Field HKEY_LOCAL_MACHINE_Field = winRegistryClass.getField("HKEY_LOCAL_MACHINE");
int HKEY_LOCAL_MACHINE = HKEY_LOCAL_MACHINE_Field.getInt(null);
String path = (String)mGet.invoke(null, new Object[] { new Integer(HKEY_LOCAL_MACHINE), "Software\\Oracle\\JavaFX\\" + version, "Path" });
4

1 回答 1

0

罐子上签了名;我制作了一个未签名的版本,它正确地混淆了!

于 2013-08-13T20:58:55.897 回答