難読化された 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 の実行に問題はありませんでした。ありがとう。
* EDIT : バイナリ比較を行う場合、マニフェスト ファイルは異なります (オリジナルはより長い) が、ASCII 比較を行うと、両方のファイルは同一です。他のすべてのファイルは完全に同一です。2 つの 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" });