24
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Eclipse + Maven + Tomcat の開発環境を快速に!?

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 ビルドのチェックもできます。

参考


  1. よくわすれるのだが、servlet-api.jar など Tomcat にあるライブラリは外すこと。クラスローダー関連でわけのわからないエラーがでてしまう。 

  2. Eclipse内でのテスト(testNG)とか、main()をRUNする場合に、何かへん? たぶん m2e さんが余計なことをやってしまっているような気がする‥ 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
24
Help us understand the problem. What are the problem?