これはJavaEE Advent Calendar 2012の11日目のエントリです。

昨日は@mike_neckさんの「CDIについて書こうとしたら、JSRを読み始めて、結果JSR330を実装してみようとしてみた件について」でした。

 

弊社ではNetBeans&GlassFishを使っています。
今回のエントリーでは、JavaEE6初心者な僕が最初に困った点について書こうと思います。
これから始める方の、何かのお役に立てれば!

業務で使う標準フレームワークを最近JavaEE6に切り替えたばかりです。
ちなみに、その前はSeasar2(S2Dao + Teeda)&Eclipse&Tomcatでした。

NetBeansでJavaEE6なWebアプリを開発する場合、プロジェクトのタイプは以下の4つが選べます。

  1. NetBeans独自形式プロジェクト + warパッケージング
  2. NetBeans独自形式プロジェクト + earパッケージング
  3. Maven形式プロジェクト + warパッケージング
  4. Maven形式プロジェクト + earパッケージング

JavaEE6になってから、ejbもwarファイルにパッケージングが出来るようになったのは
皆さん既にご存じかと思います。

各プロジェクト作成ウィザードのスクリーンショットはこちら。

  1. NetBeans独自形式プロジェクト + warパッケージング
    スクリーンショット 2012-12-11 15.29.26

  2. NetBeans独自形式プロジェクト + earパッケージング
    スクリーンショット 2012-12-11 15.29.41

  3. Maven形式プロジェクト + warパッケージング
    スクリーンショット 2012-12-11 15.33.45

  4. Maven形式プロジェクト + earパッケージング
    スクリーンショット 2012-12-11 15.34.01

弊社ではMaven形式プロジェクト + earパッケージングで開発を始めました。
理由としては、開発するサービスが非常に大きいからです。
クラス数が多いとAPサーバの起動に時間が掛かるし、メモリも消費するので、
ある程度の機能単位でejb(jar)に分けて、導入するお客様の環境で必要な分だけパッケージングしようと考えました。

こんな感じです。

  • A社様向け → 機能1 + 機能2 + 機能3
  • B社様向け → 機能2
  • C社様向け → 機能1 + 機能3

ですが、earでパッケージングしてしまうと、開発が始まって非常に困った問題が発覚。
ソースの変更を行った場合、変更を反映するために再ビルド&GlassFish再起動が必要という状況(ToT)
これでは開発の効率が非常に悪くなってしまいます。

そこで、warファイルにパッケージングしてみたところ、ソースを変更して保存したタイミングで、
アプリのHotDeploy(と呼んでいいのかな?)が行われました。

プロジェクトタイプごとのHotDeployの挙動をまとめるとこんな感じです。

  1. NetBeans独自形式プロジェクト + warパッケージング → HotDeploy可能
  2. NetBeans独自形式プロジェクト + earパッケージング → HotDeploy不可能
  3. Maven形式プロジェクト + warパッケージング → HotDeploy可能
  4. Maven形式プロジェクト + earパッケージング → HotDeploy不可能

GlassFishの管理コンソールでアプリケーションがデプロイされたパスを確認して、
そのディレクトリの中身を見てみると、
HotDeploy可能な場合はclassファイルがフラットな状態で配置されていて、
不可能なプロジェクトタイプではjarとかwarにパッケージングされて配置されてました。

  1. NetBeans独自形式プロジェクト + warパッケージング
    スクリーンショット 2012-12-11 22.29.53

  2. NetBeans独自形式プロジェクト + earパッケージング
    スクリーンショット 2012-12-11 22.30.09

  3. Maven形式プロジェクト + warパッケージング
    スクリーンショット 2012-12-11 22.31.18

  4. Maven形式プロジェクト + earパッケージング
    スクリーンショット 2012-12-11 22.30.34  

NetBeans独自形式プロジェクトのビルドツールはAntみたいですね。
せっかく新しく始めるんだし、もうAntは使いたくないので、
Maven形式プロジェクト + warパッケージングでやる事にしました。
(今時はGradleなのでしょうか?)
サーバのメモリ消費問題は、warにパッケージングする時に不要な分は除外する方法で対応するつもりです。

規模が大きい開発の場合、みなさんどうされているのでしょうか。。。(ERPとか)
「earパッケージングでもHotDeploy出来るよ!」というツッコミ等あれば是非お願いします。

明日(2012/12/12)は@kikutaro_さんです。 よろしくお願いします!!