【问题标题】:Updating jetty 7 to jetty 8 : java.lang.NoClassDefFoundError: javax/servlet/FilterRegistration将码头 7 更新到码头 8:java.lang.NoClassDefFoundError: javax/servlet/FilterRegistration
【发布时间】:2011-10-16 14:50:40
【问题描述】:

我试图通过嵌入码头来开发网络服务器。因此,使用 jetty 7.3 一切正常。昨天我将码头库更新到最新版本 8.0.3,现在我通过创建 ServletContextHandler 得到了一个异常。

线程“main”中的异常 java.lang.NoClassDefFoundError: javax/servlet/FilterRegistration 在 org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:126) 在 org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:106) 在 org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:94) 在 org.gemsjax.server.GemsJaxServer.main(GemsJaxServer.java:38)

所以我要做的是:

    public static void main(String[] args) {

     Server server = new Server(8080);


        ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContext.setContextPath("/servlets");
        servletContext.addServlet(new ServletHolder( new CollaborationWebSocketServlet()),"/collaboration");


        // The ResourceHandler to handle static web content
        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setDirectoriesListed(true);
        resourceHandler.setWelcomeFiles(new String[]{ "index.html" });


        resourceHandler.setResourceBase("./war/");


        ContextHandler resourceContext = new ContextHandler();
        resourceContext.setContextPath("/static");
        resourceContext.setHandler(resourceHandler);



        HandlerCollection handlers = new HandlerCollection();


        handlers.addHandler(resourceContext);
        handlers.addHandler(servletContext);

        server.setHandler(handlers);

        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        }


}

所以抛出异常的行是:

ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);

我正在使用 ubuntu 11.04:

openjdk java 版本“1.6.0_22” OpenJDK 运行环境 (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1~11.04.1) OpenJDK 64-Bit Server VM(build 20.0-b11,混合模式)

有人有什么建议吗?

【问题讨论】:

    标签: java jetty


    【解决方案1】:

    The javax.servlet.FilterRegistration class 是在 Servlet 3.0 中引入的。此异常表明您的运行时类路径中仍有旧 Servlet API 版本的库,这些库在类加载中具有优先权。例如,从 Internet 中随机挑选了一个 servlet-api.jar 文件,该文件位于您的 webapp 的 /WEB-INF/lib 文件夹中,或者可能位于 JRE 的 /lib 文件夹中。您应该删除那些位于类路径中其他位置而不是目标运行时本身的特定于 servletcontainer 的库。

    如果您这样做是为了规避编译问题,那么您应该将目标运行时的库放在类路径中。例如,在 Eclipse 中,您可以在项目属性的 Target Runtime 部分执行此操作。另见How do I import the javax.servlet API in my Eclipse project?

    【讨论】:

    • 感谢您的回答,但我仍然想知道 Servlet 3.0 API 在哪里可以下载? Java SE JDK 1.6 update 22 (openjdk) 不提供 Servlet 3.0 吗?我很困惑...
    • 您已经下载了它。 Jetty 8 是一个 Servlet 3.0 API 实现。您只需要掌握 Java EE API 是抽象的(即它们仅作为规范和 javadocs 存在于纸面上)以及具体的 Java EE / Servlet 容器,如 Jetty、Tomcat、Glassfish、JBoss AS 等..etc.. 是 具体 实现(即它们包含代码和库)。
    • 好吧,这是我的推理错误。我已经包含了所有码头库,但例外仍然存在
    • 如果您仍然有异常,那么这意味着您没有包含 Servlet 3.0 兼容实现的库,或者您在 运行时的某个位置仍然有旧 servlet 版本的库 类路径。 Jetty 8(应该)与 Servlet 3.0 兼容(否则它将成为 Jetty 8 中的一个主要错误),因此它仍然是第二个可能的原因。再次遍历运行时类路径涵盖的所有路径,以摆脱不同容器的容器特定库,例如 servlet-api.jarjavaee.jar 等。或者你的类路径中还有 Jetty 7 库?
    【解决方案2】:

    当您使用 SBT 时,FilterRegistration 类存在于 3.0 中,如果您使用 JETTY 或 Java 8,此 JAR 2.5 会自动添加为依赖项,

    修复: Servlet-api-2.5 JAR 是一团糟,我通过在依赖项中添加 servlet-api-3.0 jar 解决了这个问题,

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 2022-01-14
      • 2016-02-17
      • 2012-02-09
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2023-01-12
      相关资源
      最近更新 更多