2011-10-16 23 views
7

im jettyを埋め込んでWebサーバーを開発しようとしています。だから、桟橋7.3ではすべて正常に動作しました。昨日、私は桟橋のライブラリを最新のバージョン8.0.3に更新しました。今はServletContextHandlerを作成してExceptionを取得しました。 Ubuntuの11.04を使用してjetty 7をjetty 8に更新しています:java.lang.NoClassDefFoundError:javax/servlet/FilterRegistration

ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS); 

イムと::

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


} 

だから、例外をスローラインである

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がサーブレット3.0に導入されました。この例外は、古いServlet APIバージョンのライブラリがランタイムクラスパスにクラスローディングで優先されていることを示しています。たとえば、インターネットから無作為に選択されたファイルservlet-api.jarは、Webアプリケーションの/WEB-INF/libフォルダにあるか、おそらくJREの/libフォルダにあります。 ターゲットランタイム自体よりもクラスパスのどこかに座っているサーブレットコンテナ固有のライブラリを削除する必要があります。

コンパイルの問題を回避するためにこれを実行した場合は、クラスパスでターゲットランタイムのライブラリを使用する必要があります。例えばEclipseでは、Target Runtimeプロジェクトのプロパティのセクションでそれを行うことができます。 サーブレットAPI-2.5 JARた:あなたはSBTを使用する場合もHow do I import the javax.servlet API in my Eclipse project?

+1

は、あなたのanswereをありがとうございましたが、サーブレット3.0 APIをダウンロードして利用可能な場合イムはまだ不思議? Java SE JDK 1.6のアップデート22(openjdk)はServlet 3.0を提供していませんか?私は混乱しています... – sockeqwe

+1

あなたはすでにそれをダウンロードしました。 Jetty 8はServlet 3.0 API実装です。あなたは、Java EE APIが抽象**である(つまり、仕様書やjavadocとしてのみ紙に書かれています)、Jetty、Tomcat、Glassfish、JBoss ASなどの具体的なJava EE/Servletコンテナを理解する必要があります。 .. **具体的な**実装です(つまり、コードとライブラリを含んでいます)。 – BalusC

+1

オック、それは私の推論の誤りでした。私はすべての桟橋のライブラリを含んでいますが、例外はまだそこにあります – sockeqwe

0

、FilterRegistrationクラスは3.0に存在し、また、あなたはJETTYまたはJava 8このJARそれは自動的に依存関係として追加2.5を、使用している場合

修正を参照してください。そこに混乱は、私が依存関係にサーブレットAPI-3.0のjarを追加することによってこの問題を解決し、

enter image description here