(2015/07/14 追記)
このエントリではビルドパックを使って Java8 ランタイムを動かす方法を紹介していますが、現在は標準の Liberty Java ランタイムが Java8 対応しています。詳しい手順はこちらを参照ください:
Bluemix で Java8 を使う
(2015/07/14 追記終わり)



新しい環境で、新たに IBM Bluemix 向けのアプリ開発環境を作っていてハマった落とし穴の解説です。同じ穴に引っかかる人を未然に防げれば何より。


新しい PC で新たに Java + Eclipse 環境を普通に構築して、で Java ウェブアプリケーションを1つ作りました。それを IBM Bluemix にデプロイ:
2015030901


問題なく成功:
2015030902


で動作確認・・・ したらエラー!
2015030901


一応、事前にローカルホストで動作確認できていたので、コーディング上のミスは考えにくい。なんだこれは?環境依存??だとしてもどんな環境???

よくわからないので画面のエラーメッセージを読んでみる。サーブレットクラスが corrupted で UnavailableException になってる。"Check that the class file was not renamed after it was compiled" って言われても、war ファイルをデプロイしただけだし・・・

・・・ん?コンパイル??

そういえば・・・、とデプロイ時の画面の標準出力内容を見直し:
2015030903


IBM Bluemix の Liberty Java では IBM Java 1.7.1 が使われていることがわかります。そして自分の開発環境を再確認すると:
2015030902

これだ!
新しい環境には JDK 1.8 しかインストールしてなかったので、JavaSE 1.8 でコンパイルしてた!

IBM Bluemix で Liberty Java を使う場合、少なくとも現時点では JDK 1.7 を導入して使うべきですね。JDK 1.8 をインストールすること自体はいいんですが、Bluemix 用にコンパイルする場合は 1.7 互換(以下)でのビルドが必要になります。

特に新たに開発環境をセットアップするようなケースでは(深く考えずに最新版だけをインストールしちゃうと NG なので)要注意です。


(おまけ)
IBM Bluemix で「どうしても JDK 1.8 / Java 8 を使いたい!」という場合は、CloudFoundry 用の buildpack を使って、以下のように指定すると OpenJDK 1.8 (と Apache Tomcat)が含まれた Java 実行環境をランタイムにすることができます:
# cf push XXX(アプリ名)XXX -p ****.war -b https://github.com/cloudfoundry/java-buildpack.git
(おまけ終わり)


いずれかの方法で、ランタイムとアプリケーションのコンパイルバージョンを合わせることができれば、デプロイしたアプリケーションを IBM Bluemix 上で正しく動かすことができるようになります:
2015030903

↑サンプルはここで紹介したアプリを IBM Bluemix 上で動作確認したものです。
Tomcat でリライト