我正在開發一個使用java swing的簡單應用程序,我想在Windows,MacOS和Linux中使用它。 當然,我試圖將它與操作系統整合到最佳狀態。在非MACOS上捕獲java.lang.NoClassDefFoundError JRE
對於MacOS,我有這段代碼可以讓我在全局菜單和「關於」按鈕的操作中設置應用程序名稱。
我用下面的代碼:
if(System.getProperty("os.name").toUpperCase().startsWith("MAC")){
System.setProperty("com.apple.mrj.application.apple.menu.about.name", "My app name");
System.setProperty("apple.awt.application.name", "My app name");
//Need for macos global menubar
System.setProperty("apple.laf.useScreenMenuBar", "true");
try{
com.apple.eawt.Application app = com.apple.eawt.Application.getApplication();
app.setDockIconImage(Toolkit.getDefaultToolkit().getImage(MainGUI.class.getResource("images/icon.png")));
app.setAboutHandler(new com.apple.eawt.AboutHandler() {
@Override
public void handleAbout(com.apple.eawt.AppEvent.AboutEvent aboutEvent) {
AboutDialog a = new AboutDialog();
a.setTitle("About");
a.pack();
a.setResizable(false);
centerDialogInScreen(a);
a.setVisible(true);
}
});
} catch (Throwable e){
//This means that the application is not being run on MAC OS.
//Just do nothing and go on...
}
}
當我運行我在非JAVA的MacOS自JRE沒有com.apple.eawt應用*類的JVM應該拋出一個NoDefClassFoundError,我趕上,繼續吧?
這似乎並沒有那樣做,當我啓動我的應用程序「的.jar」我得到以下(在Windows上):
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: com/apple/eawt/AboutHandler
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetMethodRecursive(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.apple.eawt.AboutHandler
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
缺少什麼我在這裏?
我會創建本地副本AboutHandler和AboutEvent與原始簽名和包裝聲明相同 – HRgiger
代碼中的「else」部分是什麼? –
@HRgiger我試過使用OpenJDKs這個類的源代碼,但發現這是一個愚蠢的嘗試,因爲它會增加包的大小。 如果我創建了這些文件,我將如何讓MACOS JVM選擇安裝的文件而不是我的包上的文件? 作爲最後的手段,我可以爲每個平臺創建一個不同的主文件,併爲每個平臺生成一個不同的應用程序jar。但是,因爲我很懶(我認爲這是一種很好的方式),我想爲所有平臺生成一個包。 – loveMeansNothing