2012-03-22 81 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