Wicket和嵌入式jetty-classNotFoundException

Wicket和嵌入式jetty-classNotFoundException,jetty,wicket,embedded-jetty,Jetty,Wicket,Embedded Jetty,我正在尝试在嵌入式jetty服务器上运行我的(seam和)wicket应用程序 我得到以下例外情况: 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

我正在尝试在嵌入式jetty服务器上运行我的(seam和)wicket应用程序

我得到以下例外情况:

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);
        }
    }
}

1-更新至jetty 7或jetty 8,从外观上看,您使用jetty 6的可能性越来越大……目前我们正在开发jetty-9(jetty 7如果您需要servlet 2.5,jetty 8如果您需要servlet 3.0支持)


2-一个webapp在一个独立的类加载器中执行,因此您看到的是工作正常,您需要在您正在创建的webapp上下文上设置父类加载器优先级,或者使用服务器/系统机制仅公开那些org.slf4j类

有关在jetty中加载类的更多信息,请参阅。

我从Martjin Dashorst那里找到了答案,这里有一个很好的调试建议:

  • WEB-INF/lib
    到某个tmp文件夹中删除所有
    *.jar
  • 通过
    维修码头重启
    或类似方式重启
  • 查看日志以查找问题或发现缺少哪些类
  • 将一些JAR添加回
    WEB-INF/lib
    文件夹中(例如,按类型分组以加快速度…与orm/db相关、与ui相关、不同的功能范围及其依赖项)
  • 重复2次。到4。直到你发现真正的矛盾问题 (或者,如果您的
    WEB-INF/lib
    文件夹中根本不需要冲突的JAR(不再需要),则不需要冲突JAR)

  • 将一些类加载器相关的内容应用到
    web.xml
    对我没有帮助:

    “在webapp上下文上设置父类加载器优先级”->这不起作用,除非您指的是webAppContext以外的内容。setParentLoaderPriority(true);需要查看一些代码,了解您的设置是什么,因为这是常见的解决方案。它现在可以工作。在jetty 6中设置类加载器优先级没有任何效果。但是在jetty 7中,它似乎可以工作。只需执行上述操作,就可以为我解决此问题,而无需在任何地方进行任何调整