Eclipse + Maven + Tomcat の開発環境を快速に!?
Mavenビルドは強力ですが、Eclipse のインクリメンタルビルドに比べると遅いのが難点です。
特にWebアプリ開発で頻繁に HTML や javascript を修正する場合、
いちいち Tomcat に deploy するのでは、そのたびに時間がかかってとてもやってられません。
というわけで、ビルドを Eclipse と maven で使いわける方法にたどりつきました。
- 通常の開発は Eclipse ビルドだけ
- 正式のテストや deploy は maven ビルド
要は、Eclipseビルドと maven ビルドをへんに連携するより、はっきり分けてしまえ、という発想です。
(なおこの記事は github pages にも入れています)
主な開発環境
- Java 7
- Tomcat 7 ~ ここではデバッグ用のローカルの Tomcat を前提
- Maven 3
- Eclipse Luna
- m2e plugin
- sysdeo Tomcat plugin (古い! WPT でも同様にできると思う)
フォルダー構成
とりあえず maven 標準に合わせます。
★が Tomcat さんに見てほしいフォルダーです。
[app] は Webアプリの名前(Tomcatのコンテキスト名)です。
project/
|- src/ # ソース
| |- main/
| | |- java/
| | |- resources/
| | |- webapp/ ★ HTML,css, javascript、WEB-INF/web.xml などなど
| |
| |- test/
| | |- java/
| | |- resources/
|
|- (Maven Dependencies)/ ★ Maven の dependencies で設定した参照ライブラリ
|
|- target/ # 生成物
| |- classes/ ★ Java ソースからの生成クラス
| |- test-classes/
| |- [app]/ ~ mvn package で生成される
| |- [app].war ~ mvn package で生成される. 上の [app]/ をアーカイブしたもの
| |- その他 maven がいろいろ生成
ちょこちょこ設定
やりたいことは src/main/webapp にある HTML、javascript などの
ちょっとした修正をすぐローカルの Tomcat に反映させたい、ということです。
そのため Tomcat さんにはこのフォルダを直接見てもらう ようにします。
Eclipse のビルドパス設定
- src/main/webapp/ をソースフォルダーから外す
- java/, resources/ の出力先は通常通り target/classes/ (test-classes/) に
Tomcat プラグインの設定
- 開発用クラスローダーを有効に
- target/classes/ と Maven の参照ライブラリを選択1
Tomcat の コンテキスト.xml の設定
- antiResourceLocking,antiJarLocking を false に
- docbase を上の src/main/webapp/ に
結果
これで HTML、javascript の修正はブラウザの再読み込みだけですみます。
(ブラウザのキャッシュには注意必要)
Java ソースを修正した場合は、自動or手動で eclipseビルドすれば
target/classes/ が更新されるので、Tomcat が勝手にアプリを再ロードしてくれます。
- Javaソースの修正が頻繁な場合には何度も Tomcatの再ロードが起こってわずらわしいので、 自動ビルドを停止 or Tomcat 自体を停止します
というわけで、開発はとっても快適になったのですが、
不精な方法で多少問題もあるので2、もっとよいやり方があれば教えてください。
その他
ほんとは、webapp/WEB-INF/classes に Javaソースの出力先を指定できれば上の「開発用クラスローダーの設定」はいらないのだけど、
maven との競合、eclipse ビルドの出力先をネストできない、などの問題から上のようにしています。
なお上の設定では、target/classes が eclipse ビルドと maven で共用してますが、分けてもよいです。
また maven 用には、別に Tomcat のコンテキスト (ex. [app]-mvn)を作成し、
その docbase で target/[app]/ を参照すれば (mvn package は必要だけど)、
maven ビルドのチェックもできます。