読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

jetty.xmlの誤りを修正してjetty9を起動できるようにする手順

java tomcat mac jetty

Jetty - Servlet Engine and Http Server
jettyはjavaサーブレットコンテナであり、tomcatやJBossと競合するミドルウェアです。
google app engineもjettyが使われており、実績も十分です。
仕事ではtomcatばかりで、そろそろ新しいものを使いたかったので、jetty9を試すことにしました。
環境はmac(mountain lion)です。

jettyをダウンロードする
Eclipse Jetty Downloads
eclipseのサイトからダウンロードし、/usr/local 直下に配置します。
今回試すのはjetty9ですが、jetty9はJDK1.7以降に対応なので注意です。
JDK1.6では起動できません。
jettyが対応しているJDKのバージョンは以下を参照して下さい。
What Version Do I Use?

jettyを起動する
起動スクリプトが用意されているので、それを利用して起動します。

tree-macpro:bin tree$ /usr/local/jetty/bin/jetty.sh start

よし、これで起動っと・・・・ん?

tree-macpro:jetty tree$ java -jar ./start.jar 
2013-02-25 00:19:28.819:WARN:oejx.XmlConfiguration:main: Config error at <Call name="addBean"><Arg>|        <New class="org.eclipse.jetty.util.thread.TimerScheduler.TimerScheduler"/>|      </Arg></Call> java.lang.ClassNotFoundException: org.eclipse.jetty.util.thread.TimerScheduler.TimerScheduler in file:/usr/local/jetty-distribution-9.0.0.RC1/etc/jetty.xml
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:453)
    at org.eclipse.jetty.start.Main.start(Main.java:595)
    at org.eclipse.jetty.start.Main.main(Main.java:96)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.util.thread.TimerScheduler.TimerScheduler
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at org.eclipse.jetty.util.Loader.loadClass(Loader.java:100)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:354)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:743)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1111)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1016)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:710)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:407)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:344)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:262)
    at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1221)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1160)
    ... 7 more

ほほぅ、java.lang.ClassNotFoundException と。
jetty.xml がおかしいとstack traceに出ているので、見てみます。

    <!-- =========================================================== -->
    <!-- Add shared Scheduler instance                               -->
    <!-- =========================================================== -->
    <Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.util.thread.TimerScheduler.TimerScheduler"/>
      </Arg>
    </Call>

これですね。
TimerScheduler.TimerScheduler って非常に怪しい・・
eclipseでこのjarをクラスパスに追加して、このクラスのパスが合っているか確認します。
f:id:treeapps:20130225015053p:plain
( #^^) パス間違ってるじゃん
おいおい初期設定ファイルだぞこれ・・・
正しくは以下ですね。

    <!-- =========================================================== -->
    <!-- Add shared Scheduler instance                               -->
    <!-- =========================================================== -->
    <Call name="addBean">
      <Arg>
<!--
        <New class="org.eclipse.jetty.util.thread.TimerScheduler.TimerScheduler"/>
-->
        <New class="org.eclipse.jetty.util.thread.TimerScheduler"/>
      </Arg>
    </Call>

これでOK。

改めてjettyを起動する

tree-macpro:bin tree$ ./jetty.sh start
Starting Jetty: STARTED Jetty 2013年 2月25日 月曜日 01時53分11秒 JST
tree-macpro:bin tree$ WARNING: System properties and/or JVM args set.  Consider using --dry-run or --exec
2013-02-25 01:53:12.027:WARN::main: test-realm is deployed. DO NOT USE IN PRODUCTION!
2013-02-25 01:53:12.264:INFO:oejs.Server:main: jetty-9.0.0.RC1
2013-02-25 01:53:12.318:INFO:oejs.NCSARequestLog:main: Opened /usr/local/jetty-distribution-9.0.0.RC1/logs/2013_02_24.request.log
2013-02-25 01:53:12.343:WARN:oejj.ObjectMBean:main: Type conflict for mbean attr configurationClasses in class org.eclipse.jetty.deploy.providers.WebAppProvider
2013-02-25 01:53:12.347:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/usr/local/jetty-distribution-9.0.0.RC1/webapps/] at interval 1
2013-02-25 01:53:12.353:INFO:oejd.DeploymentManager:main: Deployable added: /usr/local/jetty-distribution-9.0.0.RC1/webapps/example-moved.xml
・・・中略・・・
2013-02-25 01:53:13.744:INFO:JavadocTransparentProxy:main: JavadocTransparentProxy @ /proxy to http://download.eclipse.org/jetty/stable-9
2013-02-25 01:53:13.744:INFO:oejsh.ContextHandler:main: started o.e.j.w.WebAppContext@2d227d01{/proxy,file:/private/var/folders/tm/vrbvlk7s67b0przw2_mdqd440000gn/T/jetty-0.0.0.0-8080-xref-proxy.war-_xref-proxy-any-/webapp/,AVAILABLE}{/xref-proxy.war}
2013-02-25 01:53:13.760:INFO:oejs.ServerConnector:main: Started ServerConnector@3cb5922e{HTTP/1.1}{0.0.0.0:8080}

よし、起動OK。
ではブラウザで画面を開いてみましょう。
http://localhost:8080/test/
f:id:treeapps:20130225015520p:plain
やっと動いた。
それにしても初期設定ファイルが間違ってるとか・・・
1回でも起動すれば1発で解るレベルのエラーなんですけどね。

フォルダ構成とか
大体以下の感じの構成です。tomcatとほぼ変わりませんね。
tomcatでおなじみの webapps/ROOT もあり、解りやすいです。

jetty
├── bin
│   └── jetty.sh
├── etc
│   ├── jetty.conf
│   └── jetty.xml
├── jetty.pid
├── lib
├── logs
├── resources
│   ├── jetty-logging.properties
│   └── log4j.properties
├── start.d
├── start.ini
├── start.jar
└── webapps
    ├── ROOT
    │   ├── images
    │   │   ├── jetty-header.jpg
    │   │   └── webtide_logo.jpg
    │   ├── index.html
    │   └── jetty.css
    └── xref-proxy.war