これまで、Mavenの目標を使用してアプリケーションをコンパイル/パッケージ化/実行するTapestry5.1.0.5Webアプリを開発してきました。mvn jetty:runゴールを使用して、JettyMavenプラグインを実行しました。これは常に正常に機能しました。MavenはJetty6.1.9を使用したようです。
ここで、実行にMavenゴールを使用しない本番環境をセットアップする必要があります。Jettyは十分に単純に見え、すでにMavenで動作していると思いました。私は6.1.26を取得し(後で6.1.9も試してみましたが、運がありませんでした)、アプリケーションのWARファイルをwebappディレクトリに入れて、実行しようとしました...運がありません。
このエラーが発生するたびに、変更されることはありません。
2010-11-17 18:33:13.436:WARN::Error starting handlers
java.lang.NoClassDefFoundError: org/apache/log4j/Level
at org.slf4j.LoggerFactory.getSingleton(LoggerFactory.java:228)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:120)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:111)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:269)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:242)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:255)
at org.apache.tapestry5.TapestryFilter.<init>(TapestryFilter.java:45)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:92)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.xml.XmlConfiguration.main(XmlConfiguration.java:985)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.mortbay.start.Main.invokeMain(Main.java:194)
at org.mortbay.start.Main.start(Main.java:534)
at org.mortbay.start.Main.start(Main.java:441)
at org.mortbay.start.Main.main(Main.java:119)
私は当初、アプリケーション全体の手動依存関係の一部としてLog4J1.2.8を使用していました。このサイトhttp://tapestry.apache.org/tapestry5.1/jetty.htmlを読んだ後、TRACEレベルに1.2.12以上を使用する必要があることに気付きました。まず、依存関係をLOG4J1.2.16に更新しました。これは機能しませんでした。
次に、apache-commons-loggingの依存関係が、その動作方法が原因でロギング全体に問題を引き起こす可能性があることを示唆する、さらにいくつかの読み物を行いました。私は依存関係の階層全体を調べ、apache-commons-loggingをすべてから除外しました。この時点では、アプリケーションはまだMaven Jettyプラグインで動作するため、これを実行しても何も壊れませんでした。しかし、WARをデプロイしても例外が発生するため、それは解決策ではありませんでした。
次のステップでは、tapestry-iocの依存関係が、システム側のlog4jと必要なlog4jの間でlog4jバージョン間で競合していることに気付きました。log4j 1.2.13を使用しており、依存関係自体のslf4jはコンパイルLog4J1.2.14を使用しているようです。
システムの依存関係を最初の1.2.14に更新し(このエラーはTapestryのslf4jで発生しているため)、その後、1.2.13で再び失敗しました。これらのケースはどちらもうまくいきませんでした。
JettyがLog4Jを、独自のロギングに使用するより低いバージョンでオーバーライドしないようにすることについての言及を聞いたことがあります。しかし、Jettyファイルには、log4jの依存関係を見つけることができる場所はありません。