2011-10-16 32 views
7

即时通讯尝试通过嵌入jetty开发Web服务器。所以,码头7.3一切正常。昨天我更新了码头库到最新版本8.0.3,现在我通过创建一个ServletContextHandler来获得一个Exception。将jetty 7更新为jetty 8:java.lang.NoClassDefFoundError:javax/servlet/FilterRegistration

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/FilterRegistration at org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:126) at org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:106) at org.eclipse.jetty.servlet.ServletContextHandler.(ServletContextHandler.java:94) at 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位服务器VM(内置20.0-b11,混合模式)

有没有人有建议?

回答

10

The javax.servlet.FilterRegistration class是在Servlet 3.0中引入的。这个例外意味着你的运行时类路径中还有一个较旧的Servlet API版本库,它在类加载中优先。例如,从互联网上随机选取servlet-api.jar文件的/WEB-INF/lib文件夹中的webapp或可能在JRE的/lib文件夹中。您应该删除这些servletcontainer特定的库,它们位于类路径中的其他位置,而不是目标运行时本身。

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

+1

感谢您的answere,但即时通讯仍然不知道其中的Servlet 3.0 API可供下载? Java SE JDK 1.6 update 22(openjdk)不提供Servlet 3.0吗?我很困惑... – sockeqwe

+1

你已经下载了它。 Jetty 8是一个Servlet 3.0 API实现。您只需要掌握Java EE API是** abstract **(即它们只在规范和javadoc中存在于纸张中)以及具体的Java EE/Servlet容器,如Jetty,Tomcat,Glassfish,JBoss AS等等。 ..是**具体**实现(即它们包含代码和库)。 – BalusC

+1

好的,这是我在推理中的错误。我已经包括了所有的码头库,但例外仍然存在 – sockeqwe

0

当您使用SBT,FilterRegistration类是目前在3.0,如果你还使用JETTY或Java 8这个JAR 2.5会自动添加为依赖,

修复: 的Servlet API-2.5 JAR是混乱在那里,我通过增加依赖servlet的API-3.0 JAR解决了这个问题,

enter image description here