2015-06-22 52 views
2

這可能聽起來很愚蠢。忍受着我。我正在研究一個Java應用程序,該應用程序的目的是在JRE 1.6或更高版本中運行。如果JRE版本低於預期的JRE運行時,優雅地退出Java應用程序

我正在使用Netbeans,並將項目屬性中的'Java Platform'信息設置爲JDK 1.6。

我遇到了一個場景,如果它運行在版本較低(1.4.2)的計算機上,則會收到以下錯誤消息。

[[email protected] mypgms]$ java -jar MyApp.jar 
Exception in thread "main" java.lang.ClassFormatError: myApp.Main (unrecognized class file version) 
    at java.lang.VMClassLoader.defineClass(libgcj.so.7rh) 
    at java.lang.ClassLoader.defineClass(libgcj.so.7rh) 
    at java.security.SecureClassLoader.defineClass(libgcj.so.7rh) 
    at java.net.URLClassLoader.findClass(libgcj.so.7rh) 
    at java.lang.ClassLoader.loadClass(libgcj.so.7rh) 
    at java.lang.ClassLoader.loadClass(libgcj.so.7rh) 
    at gnu.java.lang.MainThread.run(libgcj.so.7rh) 
[[email protected] mypgms]$ 

我有一個檢查用以下方式

static double getJavaVersion() { 
     String version = System.getProperty("java.version"); 
     int pos = version.indexOf('.'); 
     pos = version.indexOf('.', pos + 1); 
     return Double.parseDouble(version.substring(0, pos)); 
    } 

我懷疑這種方法是否會被調用或不獲取Java版本。在main()中,我將這個方法稱爲第一個語句,並且我得到了上述錯誤。正如所料,它看起來像加載類本身導致較低JRE版本中的問題。

public static void main(String[] args) throws IOException { 

     double javaVersion = getJavaVersion(); 
     System.out.println("Java Version : " + javaVersion); 
     if (javaVersion < 1.6) { 
      JOptionPane.showMessageDialog(null, "Please install JRE 1.6 or higher version.", "ERROR", JOptionPane.ERROR_MESSAGE, null); 
      return; 
     } 
     // More code 

} 

我應該怎樣優雅地顯示錯誤信息給用戶,當應用程序從較低版本的JRE的推出?

+5

我能想到的唯一的事情就是編寫一個編譯成你想到的最低版本的類。然後您將使用它來檢查JVM版本。如果它通過,你將不得不使用動態類加載(例如'Class.forName')來加載你想運行應用程序的「實際」類,這可以進行配置。作爲我頭頂的狂想法 – MadProgrammer

+3

@MadProgrammer:不是一個「瘋狂」的想法 - 該解決方案工作正常。我一直在使用它很長時間enow。 –

+0

@ MadProgrammer的想法,我想也許你可以避免動態類加載,如果你手動添加包裝類到jar。我認爲JRE會分別檢查每個類(我知道該版本是在類級別上的),而jar文件實際上只是一個zip文件。 –

回答

0

可能不是將應用程序作爲jar分發,而是可以將它打包爲一個啓動腳本,該腳本可以執行必要的先決條件檢查。 我認爲windows批處理和* nix shell腳本將覆蓋大部分需求。

+0

許多exe包裝可以在啓動Jar之前仔細檢查JVM版本,以及在Windows上,這通常是清潔的,然後是批處理文件(恕我直言) – MadProgrammer

相關問題