這可能聽起來很愚蠢。忍受着我。我正在研究一個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的推出?
我能想到的唯一的事情就是編寫一個編譯成你想到的最低版本的類。然後您將使用它來檢查JVM版本。如果它通過,你將不得不使用動態類加載(例如'Class.forName')來加載你想運行應用程序的「實際」類,這可以進行配置。作爲我頭頂的狂想法 – MadProgrammer
@MadProgrammer:不是一個「瘋狂」的想法 - 該解決方案工作正常。我一直在使用它很長時間enow。 –
@ MadProgrammer的想法,我想也許你可以避免動態類加載,如果你手動添加包裝類到jar。我認爲JRE會分別檢查每個類(我知道該版本是在類級別上的),而jar文件實際上只是一個zip文件。 –