JavaEE6 によるリアルワールド開発 その1

はじめに

ここ1ヶ月ほど、(とある事情により)JavaEE6 で開発作業をおこなっています。
この中で得られた雑多な知見についての、他の開発者の方のためのフィードバックとして簡単にさらしておこうかと思います。

今回のプロジェクトでは、Webプロファイルではない JavaEE6 で、Grassfish をコンテナとして利用しています。


JavaEE6 はずいぶんイイ、けど細かい点で改善がほしい

EOD に向けて数あるオープンソースの成果が取り込まれており開発はかなり楽になりました。しかし、JavaEE は個々の仕様の寄せ集めなので、仕様と仕様の間のささいなところで融通が効かないところがあります。
特に CDI については基盤となり個別の仕様をシームレスに連携してほしいところですが、JPA 仕様との連携や、JSF 仕様との連携などでいくつか制限があるのが実情です。
このあたりの話は、次期仕様で改善が予定されています。CDI は後から追加された仕様なので結構混乱が見られています。このあたりの資料を見るとよくわかります。


あと、例えば JavaEE の認証周りを利用していて、その上ですこし特殊なことをやろうとするととたんに融通が効かなくなるなど、拡張のしにくさが(どんなフレームワーク使っていてもありますが)やっぱりあります。


とは言え、embedded なサーバが提供されてテストが格段にやりやすくなっていたり、CoC でほぼ設定ファイルレスで開発できるようになっているなど、かなり使える状況にはなっているのではないでしょうか。
今後数回のPostに分けて、開発時に有用と考えられる情報をのせていこうかなぁと思っています。



統合開発環境はNetbeansを使うのが吉

まずは統合開発環境の選択について。
当初は Eclipse を利用していましたが、JavaEE6 を Mavenプロジェクトで扱うのであれば Netbeans を利用した方が良さそうです(ホットデプロイを利用する場合)。

開発時にホットデプロイなどは不要で、コマンドラインからデプロイできれば良いのであれば Eclipse でも扱いやすいです。しかし、WTP 経由でホットデプロイしながらの開発では、Grassfish サーバとの連携がうまく行かないなどのトラブルが出ていました。初回のサーバ起動〜デプロイの過程で、WTP がサーバへの接続に失敗し、繰り返しているとうまく動き出すなど不審な挙動が多くありました。
また不慣れな開発者がプラグインの設定で戸惑ったりして、無駄な時間を消費していました。


Netbeans の場合は、Netbeans 自体が Maven のビルドプロセスと統合されており、Git から Maven プロジェクトを clone して開くだけで、追加のプラグインや設定など行うことなく即座に開発作業に入ることができました。現時点で追加したプラグインと言えば、帳票開発のために JasperReportsのiReportプラグインを入れたぐらいです。

  • Eclipse(Juno) を利用した場合
    • プラグインの導入と設定が手間 → ×
    • WTP経由でのデプロイが不安定 → ×
    • Facelets の xhtml ファイルを修正しただけでホットデプロイのためにMavenビルドが走る → ×
    • ホットデプロイの繰り返しで premgen の OutOfMemory エラーが出る → ×
    • ヤッパリ操作に慣れている(選択してのAlt+矢印の行移動やクイック型階層とか) → ○
    • テストケースを選択して実行できる → ○
  • Netbeans(7.2 ないし 7.3) を利用した場合
    • プラグインを追加することなく開発できる → ○
    • Maven との統合具合が半端ない → ○
      • たとえばpomにカバレッジレポートの設定入れておけばIDEからカバレッジを簡単に参照できる
    • JavaEEとの統合具合が半端ない → ○
      • xhtml の EL式編集でバッキングビーンのプロパティがコード補完されるなど多々(けどジェネリクスになっているとできない)
    • Facelets の xhtml ファイル修正は待ち時間ほぼゼロでデプロイ完了する → ○
    • キーバインドを Eclipse にしておけばスムーズ → ○
    • たまにデプロイに失敗する → ×
      • アンデプロイ時にEARが残るGrassfishのバグが原因の模様(Windowsの場合)
    • テストケースを個別に選択して実行できない → ×
    • (コマンドラインから)git pull した後やリファクタリングで変なファイル名にしてしまい戻した後など、たまにキャッシュにゴミが残る → ×
      • ここのファイルを消しましょう(以下参照)
    • エディタへの入力がワンテンポ遅れることがある → ×
    • MacOSX でコンソール出力が文字化けする → ×
      • ここのファイルをいじりましょう(以下参照)

WTPをそのまま使うかエディタとして使うなら Eclipse もいいけど

WTPから1つのwarプロジェクト作るぐらいだったり、デプロイはmvnコマンド叩けば良いのであれば Eclipse がすてきですが、総合的に見て、JavaEE 開発するなら Netbeans かな。


Netbeans のキャッシュファイルクリア

Netbeans 使っていると、たまに正しいはずなのにコンパイルエラーが出たりすることがあります。クラス名を間違えて先頭小文字でリファクタリングしてしまいもとに戻したり、外部のコマンドラインで git pull した場合などで遭遇することがあります。

その場合は以下の index ディレクトリのファイルを削除して Netbeans を再起動しましょう。

  • windows
    • c:\Users\\AppData\Local\NetBeans\Cache\index
  • Linux
    • ~/.cache/netbeans/${netbeans_version}/index/
  • Mac OS X
    • ~/Library/Caches/NetBeans/${netbeans_version}/index/


注意点としては、Netbeans 7.2 からキャッシュフォルダが変更になっているので、古い情報をWebから得るとすこしはまります。
こちらを参考に。


Netbeans のコンソールの文字化け対策

そういえば昔、こちらに書いたです。

blog1.mammb.com