TomcatからJettyへ

TomcatからJettyに移行します。

まぁ、理由はそんなに大層な事じゃないです。
・WebSocket使うかも
scala使う(tomcatでもいいけど)
・触ってみたい。(いままでtomcatだから次もってのはどうかと)

maven使わずに、まずは、どノーマルに分かりやすく構成してみたいと思います。

run-jetty-run
jetty WTP Adaptor使う方法もありますが、
http://wiki.eclipse.org/Jetty_WTP_Plugin
これ、ちょっと前やりましたが、面倒です。
run-jetty-runのほうがスマートにいけそうなので、run-jetty-run使います。
http://run-jetty-run.googlecode.com/svn/trunk/updatesite
ここからインストール。
NEWSに
1.3.2 is released , better Maven support with Eclipse 3.7 ,more Jetty8/servlet support , manageable Jetty/WebApplication classpath.
と書いてあるので、おそらく最新。
Change Logにも2012/1/6ってあるので、生きてるプロジェクトなんでしょう。

jetty本体
jetty-distribution-8.1.0.RC1
をダウンロードして、適当なフォルダに解凍。

scalaプロジェクト
run-jetty-runのGettingStarted
http://code.google.com/p/run-jetty-run/wiki/GettingStarted
ここ見ると、
Project (must be a Java Project, default is the selected one.)
って書いてある。JavaProjectじゃなきゃダメ?
でも、あとでscalaやるので、一抹の不安がありながらもscalaProject作成。
scalaProjectの作成直後は、色々足りないので、
・ソースフォルダ追加。src/main/java,src/main/scala,src/test/java,src/test/scala
・webapp追加。WEB-INF,classes(出力フォルダ),lib(個別ライブラリ),web.xml作成。
・Jettyのライブラリをビルドパスに追加。
 事前に、設定→Server→Runtime EnviromentにダウンロードしたJettyを設定。(個別にJAR面倒なので)
 ビルドパスのライブラリの追加から、Server Runtimeを選択。Jettyのライブラリ追加。
 WEB-INF/libに個別Jarコピー後、ビルドパスにも追加。
tomcatで作っていたクラスコピー。パッケージ併せてあるので、エラーなし!
後は、GettingStartedを参考に、ちょっと設定。
気になったのは、デバッグの構成の一番上に「select jetty version」なんてある。
6でも起動するって事は、これrun-jetty-runがjetty内包してるのでしょうか。
プロジェクトで参照してるJettyのライブラリとデバッグのライブラリが違ったら困るなぁ・・・。
WebApp ClasspathにプロジェクトのJettyのライブラリが含まれているので、大丈夫な気もしますが。

そして、デバッグ
起動OK、http接続OK、デバッグOK、ホットデプロイ、ダメッ!
解決策は、
デバッグの構成から、Source Monitor Listのタブで、
Ignore .class fileにチェックが入ってました。
これ外すと、ホットデプロイいけました。なんでデフォルトチェックなのかな。
あと、コンテキストルートの取得で、
getServletContext().getRealPath("/");
ってすると、tomcat末尾に/付くけど、Jetty付かないな・・・。・・・。・・・。

ひとまず、開発するには、これで足りるかな。
さて、あとはJetty単体での起動。

jetty-web.xml
http://wiki.eclipse.org/Jetty/Reference/jetty-web.xml
ここ見ると、アプリケーションのWEB-INFにjetty-web.xml作りなさいよと
test.warにサンプルあるから、それ参考にしてね
ってことみたいなので、その通りに作成。
んで、まずはeclipseで起動すると、jetty-web.xmlで設定したコンテキストが有効で
デバッグで設定したコンテキストは、無効になるみたいです。
この後は、プロジェクトがwar化するのであれば、
war生成→jetty_home/webapps
で動くと思いますが、
warでない場合は、
eclipseのwsからwebappをコンテキスト名でエクスポート→jetty_home/webapps
みたいになるとカッコ悪すぎなので、
http://wiki.eclipse.org/Jetty/Howto/Deploy_Web_Applications
ここに書いてある5番目のパターン。
If the contextXmlDir option is used and a foo.xml file exists in that dir,
the WebAppProvider defers to the Contexts Provider for actual webapp deployment.
これでいきます。tomcatでのconf/Catalina/localhostですね。

そしてハマった・・・
jetty_home/contexts
に設定するのは分かってるのだけど、
http://wiki.eclipse.org/Jetty#Jetty_Documentation
ここでのサンプルがほとんど、

<Set name="war"><SystemProperty name="jetty.home"/>/webapps/zzz.war</Set>

warばっかり!ダイレクトにwebappのディレクトリを参照する設定が知りたいんですよ・・・。
の意味が、setWarってメソッド使うよという命名規則らしいので、
WebAppContextのJavaDocを眺めてたら、ありました。
http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/jetty/handler/ContextHandler.html#setResourceBase(java.lang.String)
setResourceBase(ContextHandlerは、WebAppContextのスーパークラス)
これでJetty単体で動きました。
以下、context.xml(実際は、コンテキスト名.xml、配置はjetty_home/contexts)です。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
	<Set name="contextPath">/hoge</Set>
	<Set name="resourceBase">C:\eclipse_ws\hogeJetty\webapp</Set>
</Configure>

2時間ほど、調べてました・・・。
おかげで、他の設定も色々みれました・・・。
最後に、Jettyの起動は、java -jar start.jarです。