home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2012/03/18/MavenのwarプロジェクトをEclipse上からデバッグ

日記/2012/03/18/MavenのwarプロジェクトをEclipse上からデバッグ

日記 / 2012 / 03 / 18 / MavenのwarプロジェクトをEclipse上からデバッグ
id: 1068 所有者: msakamoto-sf    作成日: 2012-03-18 18:12:29
カテゴリ: Eclipse Java Maven Subversion 

日記/2012/03/11/Eclipse3.7(Indigo)とm2eにMavenプロジェクトをインポートするメモ ではEclipseにMavenプロジェクトをインポートするところまでを紹介しました。
"jar"を生成するタイプのMavenプロジェクトであればm2eのおかげで"test"ゴールをEclipseからデバッグ実行できますので特に問題となることは少ないと思います。
困るのが"war"タイプのMavenプロジェクトで、デバッグ対象のServletコンテナをどこで起動するか、どうEclipseから接続するか、Maven独自のclasspathをどのように解決するか、というように解決すべき課題が多くなります。

いくつか調べた中でメリット・デメリットをまとめます。

jettyプラグインを使用
  • メリット:一番お手軽で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機能を使用
  • メリット: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 追記しました。

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ファイル依存関係のスマートな解決策が見当たらないので今ひとつな感じがあります。

他、参考:


プレーンテキスト形式でダウンロード
現在のバージョン : 2
更新者: msakamoto-sf
更新日: 2012-04-09 18:21:56
md5:7f9967b43f12eba9acd6f6f2f4807bc6
sha1:8e9dec18a74a0a51d1ec4a123bd48db38cdfab78
コメント
コメントを投稿するにはログインして下さい。