我在运行混淆的jar时遇到问题,当我尝试运行它时,我收到了“Java Virtual Machine Launcher”消息“发生了Java异常”。 (此错误是弹出窗口,而不是命令行)我尝试从命令行运行并从jvm控制台打印堆栈跟踪,但没有看到任何异常。
所以我做了一些故障排除:我禁用了收缩,混淆和优化,以便输出(应该)与输入相同。输出jar竟然比输入小几KB。我提取了两个罐子,反编译了.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" });
答案 0 :(得分:0)
罐子签了名;我做了一个未签名的版本,它正确地混淆了!