Jettyは起動が軽いから、Tomcatを使った、TomcatプラグインやWTPよりも快適になるかと思い、最新のJetty6を使って調査してみました。結論から書くと、Jetty向けの実行時設定が面倒だったので、「私だったらTomcatで開発するなぁ」と思いました。
設定さえ済めば、開発効率は良いのかというと、Tomcatのようなホットデプロイが、デフォルトでは無いので、停止→起動する必要があります。(軽いから停止/起動しても、Tomcatのコンテキスト再ロードと比較できる速さですけど)
JettyLauncherというeclipseプラグインがあったのですが、Jetty5までしか対応しておりませんでした…。
これがJetty6に対応するか、WTPのサーバランタイムとしてJettyが使用できれば、もっと楽になると思います。
実行の仕方を簡単にまとめます。
設定XMLファイル
まずは、動的プロジェクトを作成しましょう。WTPとしての実行機能はほとんど使えないのですが、
新規作成→サーブレットとか、WebContentフォルダを作成したりする部分は都合がよいのです。
ターゲットランタイムは「なし」でOKです。
自動デプロイはできないので、WebContent/WEB-INF/classesフォルダをつくり、そこをデフォルト出力フォルダーにします。Tomcatプラグインと同じように、コンパイルしたクラスが作成させるようになります。
またServletをコンパイルするために、ビルドパスにservlet-api-*.jarを追加します。JETTY_HOME/libにあります。
プロジェクトにJetty設定用のXMLファイルを作成します。
サンプルはこれ(jetty.xml)です。修正するのはWebAppContextの設定ぐらいです。
<new id="TestContext" class="org.mortbay.jetty.webapp.WebAppContext">
<arg><ref id="Contexts"/></arg>
<arg>※コンテキストルートをフルパスで記述する</arg>
<arg>※コンテキストパスを設定する</arg>
</new>
実行時の設定
実行はJavaアプリケーションとして実行します。手作業で実行時設定を作成しなければなりません。
[実行]-[構成および実行]から、Javaアプリケーションの構成を新規作成します。
■メイン
実行するメインクラスは、「org.mortbay.start.Main」になります。
「メイン・クラスの検索時にライブラリーを組み込む」をチェックします。
■引数
「プログラムの引数」に${project_loc}\jetty.xmlと記述します。
これは先ほど用意したjetty.xmlのパスを、変数で指定しています。
「作業ディレクトリ」は、Jettyのホームディレクトリを指定します。
■クラスパス
実行時とビルド時で、クラスパス設定がぜんぜん違います。
ビルド時に使用したからといって、WEB-INF/lib配下にある、jarを追加しないほうがよさそうです。私の場合は、ここにjstl.jarをおいてあり、それを実行時のクラスパスに追加していたら、
java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/Tag
という例外が発生してハマりました。
WEB-INF/libディレクトリ配下のJARファイルは、コンテキストが勝手に読み込むので、Jettyの起動に追加する必要はないのです。
■ソース
追加ボタンー「Javaプロジェクト」で、自身のプロジェクトを追加します。
(ソースを追加しないと、デバッグ実行時に、ソースがルックアップできない。あぁ面倒くさい)
実行
これだけ設定して、やっと動かすことができました。JSP以外ならデバッグ実行も可能です。起動や終了はサクっと立ち上がって快適です。
Tomcatを使っている感覚からすると予想以上に速く起動するので、エラーで終了したのかと思うくらいです。
他の方法として、外部ツールとしてJettyを起動し、
デバッグはリモートデバッグを使うということも試してみました。むしろこっちの方が設定がシンプルかも知れません。
2006/11/28追記
記事を読んでくれた”めそ”さんからの情報によると、以下のサイトで、Jetty5/6用のWTPプラグインを配布しています。
2006/11/05/23.56 – Yuna’s Trac – Trac
で、試してみました。
こんな感じで、サーバーランタイムにJettyが選択できるようになります。
Jetty6でも起動や停止が可能になるうえに、JSPのデバッグも可能なので、JettyLauncherを使うより便利だと思います。
Jettyは標準設定では、ホットデプロイができないのですが、やはり、ランタイムを使ってもホットデプロイはされないようでした。
Tomcatよりは速いですが、思ったよりも再起動が遅く感じました。(気のせいかも)
あと、ServletAPIなどのライブラリ(javax.servletパッケージなど)が、サーバクラスパスコンテナとして追加されないので、自分でjetty/libのservlet-api-xx.jarを追加してやる必要がありました。
2007/04/24追記
yuさんに指摘頂いたjetty.xml をデフォルトに沿うように修正しました。また実行時の設定などを書き直しました。
2008/02/20追記
JettyLauncherの作者がrun-jetty-runというプラグインを提供しているようです。(Jettyのドキュメンテーションからリンクされています)
JettyLauncherと同じように、起動構成だけを提供するだけなので、servlet-apiなど用意したりフォルダ構成を作ったりするのは自分で行うことになります。
このようなシンプルな起動方法を提供します。
通りすがりの物です。
の部分ですが、サンプルの jetty.xml に矛盾はないと思うんですが、
デフォルトの jetty.xml は contexts じゃなくて、Contexts と C が大文字なので、
もし、このブログを読まれている方は、ご注意ください…
すいません。タグが消えました。
<Arg><Ref id=”contexts”/></Arg>
の部分です。全角文字を使って表現しました。
ご指摘ありがとうございます。
jetty.xmlをデフォルトに合うように修正し、記事の方も’C’ontextに書き直しました。