2012-03-22 50 views
0

我正試圖在嵌入式碼頭服務器上運行我的(seam和)wicket應用程序。Wicket和嵌入式碼頭 - classNotFoundException

我得到以下異常:

Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366) 
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337) 
    ... 28 more 

然而,的LoggerFactory類是在我的類路徑中。我測試了這個如下:

public class StartJetty { 
    public static void main(String[] args) throws Exception { 
     ILoggerFactory fac = LoggerFactory.getILoggerFactory(); //this works! 

     Server server = new Server(); 
     ... 

完整的類:

public class StartJetty { 
    public static void main(String[] args) throws Exception { 
     Logger log = LoggerFactory.getLogger(StartJetty.class); 

     Server server = new Server(); 
     SocketConnector connector = new SocketConnector(); 
     connector.setMaxIdleTime(1000 * 60 * 60); 
     connector.setSoLingerTime(-1); 
     connector.setPort(8090); 
     server.setConnectors(new Connector[] { connector }); 
     WebAppContext bb = new WebAppContext(); 
     bb.setParentLoaderPriority(true); 
     bb.setServer(server); 
     bb.setContextPath("/wicket"); 
     bb.setWar("C:/wicket/exploded-archives/wicket.war"); 
     server.setHandler(bb); 
     try { 
      server.start(); 
      while (System.in.available() == 0) { 
       Thread.sleep(1000); 
      } 
      server.stop(); 
      server.join(); 
     } catch (Throwable e) { 
      e.printStackTrace(); 

      System.exit(100); 
     } 
    } 
} 

回答

2

1 - 更新到碼頭7或碼頭8,您使用碼頭6通過它的外觀和越來越落後於相當灰色耳朵......我們正在研究jetty-9(jetty7如果你想servlet 2.5和jetty8,如果你想要servlet 3.0的支持)

2 - 一個webapp在一個孤立的classloader中執行,所以你看到的是正確工作,您需要在webapp contex上設置父類加載器的優先級或者使用服務器/系統機制來公開那些org.slf4j類。

有關在碼頭類加載的更多信息,請http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading

+0

「設置父Web應用程序上下文中的類加載器優先級「 - >這不起作用,除非你意味着別的東西比webAppContext.setParentLoaderPriority(true); – Fortega 2012-03-22 12:31:55

+0

需要看到一些代碼,然後瞭解你的設置是什麼,因爲這是常見的解決方案 – 2012-03-22 12:49:29

+0

我編輯了問題以包含完整的代碼。檢查以上... – Fortega 2012-03-22 12:51:53

0

我找到了答案,從Martjin Dashorst這裏是一個用於調試的很好的建議:https://stackoverflow.com/a/13413342/1915920

  1. remove從WEB-INF/lib一些TMP文件夾的所有*.jar小號重啓通過service jetty restart或類似
  2. 看問題日誌或哪個c lasses被發現丟失
  3. 添加一些罐子背面(例如按類型分組到... ORM/DB相關,UI相關的,不同的功能,範圍和它們的依賴)加快它的WEB-INF/lib文件夾
  4. 重複2到4,直到你可能當場真正的衝突的問題 (或根本沒有,如果不是在你的WEB-INF/lib文件夾中的所有(不再需要有衝突的罐子)

運用一些類加載器相關的東西的web.xml沒有幫助我在那裏:https://jira.codehaus.org/browse/JETTY-574

+0

爲我解決了這個問題,而無需在任何地方進行調整,只需執行上述步驟即可 – 2015-02-28 21:04:42