モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Tomcatが動いているJavaだけ古いバージョンになる問題

慣れないJavaTomcat用にサーブレットを書いていたのですが、それが開発PC上のNetBeansでは動くものの、テストサーバの上に持って行くと動かない、という状況になりました。


開発PC環境はWindows8+NetBeans8+Java7+Tomcat8で、(本番環境と同じにした)テストサーバ環境はCentOS6+Java7+Tomcat6という構成でした。


サーブレットTomcatのクラスを利用するものだったため、Tomcat8とTomcat6の違いの問題と考え、開発環境側のTomcatを6にしたりテストサーバのTomcatを8にしたりして試したのですがダメでした。


最初、明確にTomcatのバージョンが違ったのでそっちのせいだろう、と思ってたのですが、よくよくcatalina.outのエラーを確認してみると

java.lang.UnsupportedClassVersionError: …

と言われており、TomcatのバージョンではなくJavaのバージョンが違うっぽいのが原因、とわかりました。

でもさすがに最初にそこは確認してたはず、と思ってNetBeansの利用ライブラリのバージョンが「JDK 1.7」であることを確認し、テストサーバ上でも

% java -version
java version "1.7.0_75"

となることを確認しました。


しかし、TomcatのWeb Application Manager

http://【テストサーバIP】:8080/manager/status

で確認すると、JVM Versionが「1.6.0_30」になっていることが確認できました。

というわけで、/etc/init.d/tomcat6 から起動されるTomcatはJava6を利用してしまうっぽい、ということがわかったのですが、なぜ1.7ではなく1.6が使われてしまうのかわからないという状況になりました。


そしてその時のtweet@_hito_ さんと @satoh_fumiyasu さんのからのリプライ。

この後、お二人から色々とアドバイスいただきました。超感謝です!
そのやりとり詳細見たい方は僕の最初のtweetとかから参照してみてください。


そのアドバイスと、そこから調査した結論をまとめると

  • JAVA_HOMEは /etc/tomcat6/tomcat6.conf で指定しとくべき

(じゃないとなにかちょっとしたことでJavaのバージョンが変わってしまうから)

  • JAVA_HOMEが指定されてない時のtomcat6のJavaのバージョンはjavacのバージョンになる

(/usr/share/java-utils/java-functions の set_jvm() 中でjavacのバージョン見てる)

ということになりました。


そこで /etc/tomcat6/tomcat6.conf の最初にコメントアウトされたJAVA_HOMEのところを /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75.x86_64 にすることで、無事にTomcatもJava7で動かすことが出来るようになりました。


ただ、疑問だったのがなぜこの状況になったのか、ということです。

実は /etc/alternatives/java* を確認していて、javaだけが1.7を指しており、javacなど他のものはみな1.6系を指していることがわかっていました。

そこでyumで入れたjava系のものを確認すると

% yum list installed | grep java
java-1.5.0-gcj.x86_64  1.5.0.0-29.1.el6 @base
java-1.6.0-openjdk.x86_64
java-1.6.0-openjdk-devel.x86_64
java-1.7.0-openjdk.x86_64

と、develが入っているのは1.6だけで1.7は入っていないことがわかりました。

yumJavaの1.7を入れるとき、公開サーバ用だからdevelは要らないよね?ということで「java-1.7.0-openjdk」のほうだけを入れていたのでした。

ただ、java-1.6.0-openjdk-develは入っていたので /var/log/yum.log を確認したところ、なにかで ant が必要だった時に yum で ant を入れた際に java-1.6.0-openjdk-devel が入っていたことがわかりました。

すると、javacのバージョンは1.6になるため、前述のとおりjava-functionsの中で javac のバージョンを見て Java6 が選択されてしまう、という流れになったようです。


ということで最終的な結論。

CentOS6 で tomcat6 使っててjavaのバージョンを変更したい場合、java-1.7.0-openjdk-develなど「devel」のほうを入れて、/etc/tomcat6/tomcat6.conf で JAVA_HOME も明示的に指定しておくのが良い、ということでした。