2011年12月15日木曜日

ContOSでJava SE 1.7をインストールしたけどJREバージョン違いで実行できない!

職場のCentOSでjavacを使う必要が出たのでJDKをインストールしたところ、サンプルプログラムで以下のエラーが出て実行できない現象になりました。

Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 51.0


JDKが1.7のところJREが1.6だったため起こるエラーで、JREを1.7にあげて実行できるようになりました。

JDK 1.7のダウンロードサイト
Java SE Development Kit 7u2 Downloads http://bit.ly/uJQD7G

JRE 1.7のダウンロードサイト
Java SE Runtime Environment 7u2 Downloads http://bit.ly/s8DlNQ
 
あとこのままだと、/usr/bin/javaにある古いjavaが使われるので実行パスを変更する必要があります(後述します)。 

以下のサイトに従ってJavaをインストールしてみました。
Javaアプリケーションサーバー構築(Tomcat6) - CentOSで自宅サーバー構築 http://bit.ly/w2fyGd

JDKインストールについては上記サイトの手順では1.6のパッケージでbinファイルを自己解凍しているが、以下のようにrpmファイルだったのでいきなりインストールできました。便利になってます。

# rpm -ivh jdk-7u2-linux-i586.rpm
準備中...                ########################################### [100%]
   1:jdk                    ########################################### [100%]
Unpacking JAR files...
        rt.jar...
        jsse.jar...
        charsets.jar...
        tools.jar...
        localedata.jar...
        plugin.jar...
        javaws.jar...
        deploy.jar...
実行パスを追加する設定を/etc/profileに書き込む
# vi /etc/profile
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar 
/etc/profileの最下行に3行追加しました。設定を反映させます。
# source /etc/profile 
最後に環境変数PATHを再度書き換えることになりました(後述)。

続けて、CentOSで自宅サーバー構築 http://bit.ly/w2fyGd に従ってHelloWord.javaを作成しjavacコマンドでコンパイルしjavaコマンドで実行すると以下のようなエラーがでます。
 # vi HelloJava.java
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}
# javac HelloWorld.java
# java HelloWorld
Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: HelloWorld. Program will exit.
「Exception in thread "main" java.lang.UnsupportedClassVersionError」でGoogle検索かけてみると以下のサイトが見つかりました。

Javaの道>掲示板(実行時のNoClassDefFoundErrorについて) http://bit.ly/sxIjR5

みなさん同じような現象に困ったようです。javacコンパイラとjava実行コマンドのバージョンが一致しないためにでるエラーということです。
# javac -J-version
java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing)
# java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.8) (rhel-1.22.1.9.8.el5_6-i386)
OpenJDK Client VM (build 19.0-b09, mixed mode)
javacが1.7でjavaはOpenJDKの1.6ということでバージョンが一致していません。

という訳で、JREも最新の1.7をダウンロードすることにしました。

# rpm -ivh jre-7u2-linux-i586.rpm
準備中...                ########################################### [100%]
   1:jre                    ########################################### [100%]
Unpacking JAR files...
        rt.jar...
        jsse.jar...
        charsets.jar...
        localedata.jar...
        plugin.jar...
        javaws.jar...
        deploy.jar...
これで良し良しと思いましたが、エラーは変わらず 「Exception in thread "main" java.lang.UnsupportedClassVersionError」になります。
以下のようにOpen-JDKのJRE1.6を削除してみても同様の現象。
#rpm -e java-1.6.0-openjdk-1.6.0.0-1.22.1.9.8.el5_6
おかしいなと思いながら、もう一度javaのバージョンを確認してみると…。
# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-50)

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!?バージョンが1.4.2になってる!1.6からさらに下がっています。
どこかにjavaコマンドがあるようなので探してみました。
# which java
/usr/bin/java
/usr/bin下にありました。あまり深く考えず、実行パスの優先順位を変えることで解決させました。
# vi /etc/profile
最下行に追加した3行のうち、環境変数PATHだけ書き換えます。
export JAVA_HOME=/usr/java/default
#export PATH=$PATH:$JAVA_HOME/bin
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
これで、設定を反映させて確認するとOKです。
# source /etc/profile 
# which java
/usr/java/default/bin/java
#java -version
java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) Client VM (build 22.0-b10, mixed mode, sharing)
これでjava実行コマンドは1.7に。javacコンパイラも1.7になり問題なく実行できました。
# java HelloWorld
Hello World
こまかいバージョン違いで手間の取る作業が増えますね(-_-;;;
この手のトラブルはブログにしておいて、情報を共有しておきます。
(自分もまた忘れてしまいそうだし!!)

0 件のコメント:

コメントを投稿