我一直試圖在一個專案中包含slf4j,但沒有成功。我已經將slf4j-api-1.7.32.jar和slf4j-jdk14-1.7.32.jar添加到classpath中,但是無論我怎么嘗試,最后都出現了java.lang.ClassNotFoundException: org.slf4j.LoggerFactory。
錯誤的初始部分是
。Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
在java.net.URLClassLoader.findClass(URLClassLoader.java:382)
在com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWithReload$WebAppClassLoaderExtension.findClass(JettyLauncher.java:354)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366)
at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337)
...
(如果有幫助的話,我很樂意包括更多的內容,但是編譯器在這一點上把它切斷了)
該專案是在Eclipse中進行的。
該專案是在Eclipse中,我已經嘗試過了
將庫放在類路徑的開頭似乎沒有什么作用。
然而,奇怪的是,對于完全相同的庫集合,它在我撰寫的 JUnit 測驗中運行良好。
今天早上,一位同事發現將這對slf4j庫添加到war/WEB-INF/lib中后,事情就正常了,但這并不是一個可行的長期解決方案。
我希望外面的人有一些聰明的想法!
編輯。 又取得了一些進展。從這里需要添加
<Set name="systemClasses">
<Array type="java.lang.String"/span>>
<!--我們從jetty WebAppContext源代碼中...-->
<專案>java.</Item>
<Item>javax.servlet.</Item>
<專案>javax.xml.</Item>
<專案>org.mortbay.</Item>
<Item>org.xml.</Item>
<專案>org.w3c.</Item>
<專案>org.apache.commons.logging.</Item>
<專案>org.apache.log4j.</Item>
<!--和...添加了slf4j-->
<專案>org.slf4j.</Item>
</Array>
</Set>
到jetty-web.xml。現在需要找出部署腳本中需要修改的地方。
uj5u.com熱心網友回復:
解決方案:
在jetty-web.xml中添加以下 "systemClasses "設定
<Configure class="org.mortbay.jetty.webapp.WebAppContext"/span>>
...
<Set name="systemClasses"/span>> ...
<Array type="java.lang.String"/span>>
<!--我們從jetty WebAppContext源代碼中復制了這些路徑...-->
<Item>java.</Item>/span>
<Item>javax.servlet.</Item>
<Item>javax.xml.</Item>
<Item>org.mortbay.</Item>
<Item>org.xml.</Item>
<Item>org.w3c.</Item>
<Item>org.apache.commons.logging.</Item>
<Item>org.apache.log4j.</Item>
<!--和...添加slf4j-->
<Item>org.slf4j.</Item>
<!--我們必須將slf4j提升為系統類,否則gwt
托管模式將不允許加載它們,因為有一個政策
政策,不允許從外部世界加載服務器類。
的政策,不允許從外部世界加載服務器類(見gwt JettyLauncher源代碼)。-->
</Array>/span>
</Set>/span>
</Configure>
如在2009年的這個留言板中發現的。https://www.mail-archive.com/[email protected]/msg14754.html
我們是如何找到解決方案的:
當踏過JettyLauncher.WebAppContextWithReload.WebAppClassLoaderExtension.findClass(String name)時,發現在第一次加載時,大多數super.FindClass(name)都會被洗掉。 findClass(name)會拋出一個ClassNotFoundException,然后當他們通過isServerPath時,他們開始使用systemClassLoader來從.jar檔案中加載它們。現在systemClassLoader有一個父型別URLClassLoader,它有一個欄位ucp(URLClassPath),它有一個串列(在path下),列出了所有它可以加載類的.jar檔案。看看這里,slf4j jars確實存在,但由于某些原因,isServerPath被回傳為true。這就是最終導致找到上述解決方案的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308363.html
標籤:
