2010-11-17 65 views
0

到目前爲止,我一直在開發一個使用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依賴。

+0

它看起來像類路徑中缺少log4j。如果您使用WAR進行部署,您是否可以驗證WAR是否包含log4j JAR? – pstanton 2010-11-17 20:07:01

+0

嗯,它看起來不像它。我很困惑,我的基本配置在整個項目的父pom.xml中包含了LOG4J。想想可能是某種方式沒有被應用到WAR中,我嘗試在Web應用程序pom.xml中包含相同的依賴項,但log4j-1.2.13.jar不顯示。我在理解maven及其包裝過程中錯過了什麼? – Rich 2010-11-17 21:24:29

+0

也許;)但我真的不明白/像maven!但如果WAR不包含JAR,這絕對是一個maven問題。如何發佈你的pom.xml?另外,雖然堆棧跟蹤很重要,但並不是所有的東西都是相關的(即「TapestryFilter」下的所有東西)。 – pstanton 2010-11-18 01:45:03

回答

1

我要去有一個猜測:

這個「可能」由

  1. 當Maven下載log4j的依賴造成的,它失敗或損壞 - 嘗試刪除log4j的目錄你的Maven倉庫(Windows:文檔和設置/用戶/ .m2/....)

  2. 有某種依賴衝突和maven正在做一個廢話的工作,解決它不包括任何 - 這是不太可能,我認爲它會包括最新的版本

  3. 一些其他的Maven插件或配置導致log4j的罐子從WAR創建排除(杜)

不知道還有什麼可以導致此...

重新編輯評論:

啊是的,現在你提到它我有這個問題!我有幾個「自我管理」(即不是maven管理)的罐子,據我所知,將它們包含在maven classpath中的唯一方法是給它們一個system範圍。你的問題變成:「我如何在Maven構建中包含非Maven jar?」

scope元件的文檔:

依賴性的範圍 - 編譯,運行時,測試,系統,和提供。用於計算用於編譯,測試等的各種類路徑。它還有助於確定哪些工件要包含在該項目的分佈中。有關更多信息,請參閱依賴關係機制。

,如果你還更改條目的範圍與Systempath下你在你的POM得到一個錯誤:

只有系統範圍的依賴性可以指定Systempath下。

編輯2:找到一個好的解決辦法...

我發現this 'issue' report,其次爲最後的評論所說的路徑:

我們是不會這樣做的。我猜你可能會爲你想要的文件和一個targetPath添加一個帶有include的webresource部分。

Here's the documentation regarding the mechanism.

,所以你需要做的是:

<build> 
... 
    <plugins> 
... 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <webResources> 
        <resource> 
         <directory>unmanaged-lib</directory> 
         <targetPath>WEB-INF/lib</targetPath> 
         <includes> 
          <include>**/*.jar</include> 
         </includes> 
        </resource> 
       </webResources> 
      </configuration> 
     </plugin> 

... 
    <plugins> 
... 
<build> 

注意:路徑「非託管的lib」是在你的項目的根在這種情況下迪爾(即水平與pom.xml)從您的堆棧跟蹤

+0

我在看的越多,似乎手頭的問題就是Maven只包含依賴關係的運行時和編譯範圍(http:// stackoverflow。com/questions/1565657/include-maven-dependencies-in-the-assembly-war),而我的許多依賴項在本地開發系統上有各種各樣的原因,並且在pom.xml中被定義爲System。看起來有點令人沮喪,儘管Maven認爲我在同一個系統上部署了WAR,並且我想在生產環境中手動管理大型類庫,而不是將其複製到WAR本身。 – Rich 2010-11-18 16:25:35

+0

如果你發佈了你的pom,這將會更加明顯。請參閱編輯。 – pstanton 2010-11-18 22:14:51

+0

好點,哎呀。 我偶然發現了有關Maven的MWAR-23報告,但我也發現並開始研究http://zh.efreedom.com/Question/1-2065928/Maven-Assembly-Dependencies-Jar-Scope-System-Included 我能夠得到這個工作,管理我自己的本地存儲庫,甚至只是發佈你所擁有的系統jar到你配置的本地maven存儲庫。我覺得那很整齊。 有些抨擊,但我很高興我們有兩個解決方案張貼在這裏,這很酷。我會給你支票,因爲我完全相信解決方案也能起作用,並且你已經付出了很大的努力。 – Rich 2010-11-18 23:08:26