【问题标题】:Wicket and embedded jetty - classNotFoundException检票口和嵌入式码头 - classNotFoundException
【发布时间】:2012-03-22 11:03:21
【问题描述】:

我正在尝试在嵌入式码头服务器上运行我的(接缝和)检票口应用程序。

我得到以下异常:

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

【问题讨论】:

    标签: jetty wicket embedded-jetty


    【解决方案1】:

    1 - 更新到 jetty 7 或 jetty 8,从外观上看,您使用的是 jetty 6,而且耳朵后面变得很灰...我们目前正在处理 jetty-9(如果您想要 servlet,则为 jetty7 2.5 和 jetty8 如果你想要 servlet 3.0 支持)

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

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

    【讨论】:

    • "在 webapp 上下文中设置父类加载器优先级" -> 这不起作用,除非你的意思不是 webAppContext.setParentLoaderPriority(true);
    • 然后需要查看一些代码并了解您的设置是什么,因为这是常见的解决方案
    • 现在可以使用了。在 jetty 6 中设置类加载器优先级没有任何效果。然而,在 7 号码头,它似乎正在工作。
    【解决方案2】:

    我从 Martjin Dashorst 找到了答案,这是一个很好的调试建议:https://stackoverflow.com/a/13413342/1915920

    1. WEB-INF/lib中删除所有*.jars到某个tmp文件夹
    2. 通过service jetty restart或类似方式重启
    3. 查看日志中的问题或发现哪些类缺失
    4. 添加一些 jars 回来(例如,按类型分组以加快速度……orm/db 相关、ui 相关、不同的功能范围及其依赖项)到 WEB-INF/lib 文件夹
    5. 重复 2. 到 4. 直到您可能发现真正的冲突问题 (或者,如果您的 WEB-INF/lib 文件夹中根本不需要冲突的 jar (不再),则不需要)

    将一些与类加载器相关的东西应用于web.xml 并没有帮助我:https://jira.codehaus.org/browse/JETTY-574

    【讨论】:

    • 为我解决了这个问题,无需在任何地方进行任何调整,只需执行上述操作
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 2014-02-25
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多