Wicket和嵌入式jetty - classNotFoundException

时间:2012-03-22 11:03:21

标签: jetty wicket embedded-jetty

我正在尝试在嵌入式码头服务器上运行我的(接缝和)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);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

1 - 更新到码头7或码头8,你的外观使用码头6并且耳朵后面变得非常灰...我们正在制作jetty-9(如果你想要servlet,那就是jetty7 2.5和jetty8,如果你想要servlet 3.0支持)

2 - webapp在隔离的类加载器中执行,所以你看到的是正常工作,你需要在你正在创建的webapp上下文中设置父类加载器优先级,或者使用服务器/系统机制来公开那些org.slf4j类。

有关jetty中类加载的更多信息,请参阅http://wiki.eclipse.org/Jetty/Reference/Jetty_Classloading

答案 1 :(得分:0)

我发现 Martjin Dashorst 的答案是一个很好的调试建议:https://stackoverflow.com/a/13413342/1915920

  1. *.jar 删除所有WEB-INF/lib到某个tmp文件夹
  2. 通过service jetty restart 或类似
  3. 重新启动
  4. 查看日志中的问题或找到哪些类缺失
  5. 添加一些罐子(例如按类型分组以加速它... orm / db相关,ui相关,不同的功能范围及其依赖性)到{{1} }文件夹
  6. 重复2.到4.直到您可能发现真正存在冲突的问题 (如果您的WEB-INF/lib文件夹中根本不需要有冲突的罐子,则无论如何
  7. 将一些类加载器相关内容应用到WEB-INF/lib并没有帮助我:https://jira.codehaus.org/browse/JETTY-574