2011-12-22 7 views
7

java.lang.UnsupportedClassVersionErrorとは何ですか? 何がjava.lang.UnsupportedClassVersionErrorですか?

私は docから読み取る:Java仮想マシンが、クラスファイルの読み込み中に、そのファイルのメジャーバージョンとマイナーバージョン番号がをサポートされていないと判断した場合にスローされ 、それどういう意味か理解できませんでした。

のメジャーおよびマイナーバージョンはファイルに含まれていますか?

次の例外がスローされたとき、私は他の誰かのマシンでアプリケーションを立ち上げ:

Exception in thread "main" java.lang.UnsupportedClassVersionError: client (Unsupported major.minor version 51.0) 
    at java.lang.ClassLoader.defineClass0(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:539) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:251) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:55) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:194) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302) 

それは私のマシン上でうまく働いたのに。

答えて

10

異なるバージョンのJDKコンパイラでは、異なるクラスバージョンが生成されます。たとえば、Java 1.4では48.0が生成され、1.5では49.0と1.6 50.0が生成されます。

JVMは、一般に、JVMのクラスを自身よりも「少ない」が、決してそれより大きくすることはできません。 1.6用にコンパイルされたクラスを1.5 JVMなどで使用しようとしている可能性があります。

興味のある方は、クラスのバージョンを見つけるための良いツールはbcelです。特に、それは良い仕事のセットを持っています。

+0

'javap'(javaの組み込み逆アセンブラ)を使用して、メジャーとマイナーバージョンをチェックできます。プログラムによるこのバージョンチェックを実行する場合は、BCELがより適切です。 – peakit

3

これは、コンパイラのバージョンが、クラスを実行しようとしているjvmバージョンより新しいことを意味します。マシンのJavaコンパイラをダウングレードするか、他のマシンのランタイムjvmをアップグレードしてください。

+1

3番目のオプションがあります(ほとんどのJavaコンパイラ用)。最新のコンパイラが古代のJVMに適したバイトコードを生成する 'javac -target 1.1'のようなことをすることができます。実際にコンパイラをダウングレードする必要はありません。 – emory

+0

@ emory「1.1」とは何ですか? –

+1

@SuhailGupta私の例では、1.7コンパイラがありますが、1.1 JVMでバイトコードを使いたいと思います。あなたのケースでは、1.6コンパイラがありますが、1.5 JVM(http://stackoverflow.com/a/8605030/348975のように)でバイトコードを使いたい場合は、 'javac -target 1.5'を使います – emory

関連する問題