Java Proguard模糊化jar赢得';t发射

Java Proguard模糊化jar赢得';t发射,java,jar,javafx,obfuscation,proguard,Java,Jar,Javafx,Obfuscation,Proguard,我在运行我的模糊jar时遇到了问题,当我尝试运行它时,我收到了“Java虚拟机启动器”消息“Java异常已发生”。(这个错误是一个弹出窗口,不是在命令行上)我尝试从命令行运行并从jvm控制台打印stacktrace,但没有看到任何异常 所以我做了一点故障排除:我禁用了收缩、模糊和优化,以便输出(应该)与输入相同。结果表明,输出jar比输入jar小了几KB。我提取了两个JAR,反编译了.class文件,比较了每个文件的源代码和MANIFEST.MF,它们都是相同的* 我使用的是ProGuard 4

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

所以我做了一点故障排除:我禁用了收缩、模糊和优化,以便输出(应该)与输入相同。结果表明,输出jar比输入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可以看到错误消息和HKEY_本地机器的使用:

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) });


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

如ProGuard手册所述,您如何查找Name、getMethod、getField等方法的类方法的使用情况?@rcook我通过不处理任何类的任何方法验证了这些类方法未被处理。事实上,我禁用了所有模糊处理,反编译了结果jar,并验证了所有源文件都没有更改。我可能不理解你的评论,或者你可能不理解我的问题。以前有人遇到过这样的问题吗?谢谢。我指的是程序,不是ProGuard。该程序是否在forName()或反射表单中使用了reset()或ERROR_消息?我不知道该怎么做。我的所有类都没有使用reset()或错误消息。在Netbeans中编译我的javafx程序时,它添加了com.javafx.main.main和com.javafx.main.NoJavaFXFallback。这两个类都没有使用reset()方法,只有javafx.main.main使用ERROR_消息(我将在上面发布代码)如何使其不签名?
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" });