到目前爲止,我一直在開發一個使用Maven目標來編譯/打包/執行應用程序的Tapestry 5.1.0.5 web應用程序。我使用mvn碼頭:運行目標來運行Jetty maven插件。這總是很好。看來Maven使用Jetty 6.1.9。Log4j,Tapestry 5.1,獨立碼頭6不玩?
我現在需要設置一個不使用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)
我最初使用的Log4J 1.2.8作爲我作爲一個整體的應用程序我手動依賴的一部分。我讀了這個網站http://tapestry.apache.org/tapestry5.1/jetty.html,然後意識到我應該使用1.2.12或更高的TRACE級別。首先我更新我的依賴LOG4J 1.2.16。這沒有奏效。
然後,我做了一些進一步的閱讀,提示apache-commons-logging依賴可能會導致日誌記錄問題,因爲它的工作原理。我瀏覽了整個依賴關係層次並排除了apache-commons-logging。該應用程序仍然適用於Maven碼頭插件,因此我沒有通過這樣做破壞任何東西。但是當我部署WAR時,我仍然會遇到這種情況,所以這不是解決方案。
下一步我意識到tapestry-ioc依賴關係在我的系統端log4j和它想要的之間的log4j版本上發生衝突。它似乎使用log4j 1.2.13,並且依賴項本身中的slf4j使用編譯Log4J 1.2.14。
我更新了我的系統的依賴是第1.2.14(因爲該錯誤是在SLF4J Tapestry中存在的),然後在與1.2.13再次失敗。這兩種情況都沒有發生。
我聽說確保碼頭不與它使用自己的日誌記錄較低的版本覆蓋你的Log4J提及。然而,在Jetty文件中沒有任何地方可以找到任何log4j依賴。
它看起來像類路徑中缺少log4j。如果您使用WAR進行部署,您是否可以驗證WAR是否包含log4j JAR? – pstanton 2010-11-17 20:07:01
嗯,它看起來不像它。我很困惑,我的基本配置在整個項目的父pom.xml中包含了LOG4J。想想可能是某種方式沒有被應用到WAR中,我嘗試在Web應用程序pom.xml中包含相同的依賴項,但log4j-1.2.13.jar不顯示。我在理解maven及其包裝過程中錯過了什麼? – Rich 2010-11-17 21:24:29
也許;)但我真的不明白/像maven!但如果WAR不包含JAR,這絕對是一個maven問題。如何發佈你的pom.xml?另外,雖然堆棧跟蹤很重要,但並不是所有的東西都是相關的(即「TapestryFilter」下的所有東西)。 – pstanton 2010-11-18 01:45:03