日記/2012/03/11/Eclipse3.7(Indigo)とm2eにMavenプロジェクトをインポートするメモ ではEclipseにMavenプロジェクトをインポートするところまでを紹介しました。
"jar"を生成するタイプのMavenプロジェクトであればm2eのおかげで"test"ゴールをEclipseからデバッグ実行できますので特に問題となることは少ないと思います。
困るのが"war"タイプのMavenプロジェクトで、デバッグ対象のServletコンテナをどこで起動するか、どうEclipseから接続するか、Maven独自のclasspathをどのように解決するか、というように解決すべき課題が多くなります。
いくつか調べた中でメリット・デメリットをまとめます。
- jettyプラグインを使用
-
- Maven Jetty Plugin - Jetty - Codehaus (version 6系まで)
- Jetty/Feature/Jetty Maven Plugin - Eclipsepedia (version 7系以降)
- Rapid Testing Using the Jetty Plugin
- メリット:一番お手軽でEclipseとの親和性も高い方法です。
- jettyのMaven用プラグインを使うと、"mvn jetty:run" で軽量Servletコンテナが立ち上がります。プラグインの方でMaven独自のソースツリーやjarの依存関係を処理してくれます。あとは"jetty:run"ゴールをEclipse上からデバッグ実行するだけです。
- また"target/classes"やweb.xml, pom.xmlをポーリングしてくれる設定も可能で、Eclipse上からの変更を間をおかずに反映することが可能です。
- デメリット
- 単純なwarであれば対応可能ですが、特定のServletコンテナに依存したりJ2EEサーバの機能を利用したりするような場合は適用が難しいかもしれません。
- Tomcat7のVirtual webapp機能を使用
-
- Apache Tomcat 7 Configuration Reference (7.0.26) - The Context Container
- メリット:Tomcatコンテナ上でデバッグ実行可能です。
- Mavenのソースツリーをそのまま使ってTomcat上にDeployすることが可能です。
- Eclisep WTP の機能で"Server"を作成してEclipse上からデバッグ実行可能です。
- m2eプラグインであれば、出力パスの関係から、Eclipse上で保存→コンパイル→Tomcat側でContextリロードまでがスムーズに連携するはずです。
- デメリット
- Tomcat 7以降が必要です。
- Mavenのjar依存関係までは解決してくれないので、Context設定に1つずつjarのフルパスを記述する必要があります。
- メリットを覆い隠すほどのデメリットになり得るので、個人的にはあまりおすすめできない方法です。
- 詳しくは調べていないのですが、JarScannerを設定すればもしかしたら自動スキャンとかしてくれるかも・・・?
- warファイル展開用ゴールを使う
-
- メリット:一番汎用性が高い方式
- warファイルを展開した状態のファイルツリーを生成します。
- あとは使用するServletコンテナに応じた方法でContextを設定します。Servletコンテナのデバッグ方法については、コンテナに依存します。
- Tomcat位ならローカルのEclipse上で動作させることができますが、WebLogicなど本格的な「重い」アプリケーションサーバ上で動かすとなると、外部サーバ上でリモードデバッグ有効で起動しておき、そちらにEclipse上からMavenでデプロイ+リモードデバッグ接続を行うほうが良いかもしれません。
- ほとんどのServletコンテナおよびJ2EEサーバに対応できる方式と思われます。
- デメリット
- Eclipse上でコンパイルしただけではコンテナに反映されないため、"war:exploded"ゴールを実行+コンテナにContextをリロードしてもらう必要があります。
- そのため、ソースコード編集〜デバッグ実行までに若干のタイムラグが発生します。
- tomcat-maven-plugin を使う
-
2012-04-09 追記しました。
- Java/Maven3/Eclipse上でサクサクWeb開発 (例:tomcat-maven-plugin) - Glamenv-Septzen.net
Maven独自のソースツリーと、Eclipse上でJava保存→即時コンパイル→コンテキストリロード、そこまでは何かしら解決策があります。どうしてもMavenのjarファイル依存関係、それがボトルネックになり、jetty:runかdeployして実行(場合によってはリモートデバッグ接続)かの分水嶺となっています。
2012-04-09 追記
tomcat-maven-plugin を使うことで、JettyだけでなくTomcatでもdeployせずにEclipse上からシームレスにデバッグまで繋げられることが出来ることが判明しました。
以前、WebLogic と Ant でJ2EEサーバの機能を使用したWebアプリを開発していたときは、外部でリモートデバッグ接続を有効にしたWebLogicを立ち上げておいて、そちらにAntからwarをdeploy→Eclipseからリモートデバッグ接続、という手順を踏んでいました。多少のタイムラグはありましたが、それでもリズムを崩す程ではなかったです。
Tomcat7のVirtual webappも「よくぞ対処してくれた」感はあるものの、やはりjarファイル依存関係のスマートな解決策が見当たらないので今ひとつな感じがあります。
他、参考:
- Maven war plugin Introduction
- How do I run a maven web application in Tomcat from Eclipse? - Web Tutorials - avajava.com
プレーンテキスト形式でダウンロード