2011-10-16 12 views
7

sto cercando di sviluppare un server Web incorporando il molo. Quindi con il molo 7.3 tutto ha funzionato bene. Ieri ho aggiornato le librerie del molo alla nuova versione 8.0.3 e ora ottengo un'eccezione creando un ServletContextHandler.Aggiornamento del jetty 7 al 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)

Quindi quello che faccio è:

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


} 

Così la linea che gettare l'eccezione è:

ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS); 

Im usando Ubuntu 11.04 con:

versione OpenJDK Java " 1.6.0_22 " OpenJDK Runtime Environment (IcedTea6 1.10.2) (6b22-1.10.2-0ubuntu1 ~ 11.04.1) OpenJDK 64-Bit Server VM (build 20.0-b11, modalità mista)

Qualcuno ha un suggerimento?

risposta

10

The javax.servlet.FilterRegistration class è stato introdotto in Servlet 3.0. Questa eccezione suggerisce che sono ancora presenti librerie di una versione dell'API Servlet precedente nel percorso di classe di runtime che ha la precedenza nel caricamento delle classi. Ad esempio, una scelta casuale da Internet ha selezionato il file servlet-api.jar nella cartella /WEB-INF/lib della tua webapp o forse nella cartella /lib di JRE. È necessario rimuovere quelle librerie specifiche di servlet che si trovano da qualche altra parte nel classpath rispetto al runtime di destinazione stesso.

Se si è fatto questo per aggirare i problemi di compilazione, è necessario invece prendere le librerie del runtime di destinazione nel classpath. Ad esempio, Eclipse, è possibile farlo nella sezione Target Runtime delle proprietà del progetto. Vedere anche How do I import the javax.servlet API in my Eclipse project?

+1

grazie per il vostro answere, ma im ancora chiedendo dove l'API servlet 3.0 è disponibile per il download? L'aggiornamento 22 di Java SE JDK 1.6 (openjdk) non fornisce Servlet 3.0? Sono confuso ... – sockeqwe

+1

Hai già scaricato. Jetty 8 è un'implementazione dell'API Servlet 3.0. Devi solo capire che le API Java EE sono ** astratte ** (cioè esistono solo in carta come specifiche e javadoc) e che i contenitori Java EE/Servlet concreti come Jetty, Tomcat, Glassfish, JBoss AS ecc .. etc .. sono le ** implementazioni concrete * (cioè contengono il codice e le librerie). – BalusC

+1

Ok, era il mio errore nel ragionamento. Ho incluso tutte le librerie del molo, ma l'eccezione è ancora lì – sockeqwe

0

Quando si utilizza SBT, classe FilterRegistration è presente in 3.0 e anche se si utilizza MOLO o Java 8 questo JAR 2.5 aggiunge automaticamente come dipendenza,

Fix: Servlet-api-2.5 JAR era il casino lì, ho risolto questo problema aggiungendo vaso servlet-API-3.0 in dipendenze,

enter image description here