java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer


85

Jersey + Googleアプリエンジンを使用して、2日間簡単なHelloWorldアプリケーションを構築しようとしています。単純なAppEngineプロジェクトの場合、これらのチュートリアルに従い、どちらも問題なく動作します https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

しかし今、私はジャージーを追加しようとしており、このチュートリアルhttp://www.vogella.com/articles/REST/article.htmlに従っています

しかし、サーバーは私に与え続けます

java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

これらの行をweb.xmlに追加すると:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

ここJAX-RS 2.1 RI bundleからJerseyをダウンロードし、チュートリアルの説明に従って、すべてのjarファイルをフォルダーに追加しました。そして、2日後でも何も機能していません。私はGoogleで何度か検索しましたが、Mavenを使用している人はどうやらそれを解決したようですが、私はMavenを使用しておらず、そのチュートリアルを書いた人もそうしませんでした。WEB-INF/lib

com.sun.jersey.spi.container.servlet.ServletContainerインポートされたものJersey jarsにさえ存在する かどうかを確認するために、この完全修飾名をJavaで記述し、インテリセンスに名前を補完させようとしましたが、その後インテリセンスを取得できなかったcom.sun.jeため、最新のジャージービルドでパッケージの再配置が行われたと推測されます。の中にjerseyはありませんcom.sun。私は疲れ果てており、どんな種類の助けもいただければ幸いです。


ジャージーをどのようにインストールしましたか?バージョン2.29より前のものにアクセスできず、2.11に関する記事がありますか?
ピクセル

回答:


154

Jersey 2(JAX-RS 2のRI)をダウンロードしました。あなたが参照しているチュートリアルはJersey1を使用しています。(ここ)からJersey1.17.1をダウンロードしてください。

ジャージー1はを使用しcom.sun.jersey、ジャージー2はorg.glassfish.jerseyそれ故に例外を使用します。

また、でinit-param始まることもcom.sun.jerseyジャージー2によって認識されないことに注意してください。

編集

ジャージー2でのリソースとプロバイダーの登録には、ジャージー2でクラス/インスタンスを登録する方法に関する追加情報が含まれています。


2
+1。同様の問題を抱えている他の人への追加として、公式のジャージーユーザーガイド:第4章RESTful Webサービスのデプロイ
informatik01

6
サーブレットコンテナの新しいクラスは「org.glassfish.jersey.servlet.ServletContainer」です
cljk 2014年

4
サーブレットクラス:org.glassfish.jersey.servlet.ServletContainer、init-param-name:jersey.config.server.provider.packages。
picmate涅

1
この回答は問題/エラーの理由をよく説明していますが、解決策は非常にオープンなままです。なぜなら、あなたが提供したわずかな情報では、問題を解決できなかったからです。pom.xml、web.xml、およびjavaファイルの詳細については、より適切な作業が可能です。または、読者をJersey 2.xのチュートリアルに導くブログまたは記事を参照してください
Paulo Oliveira

1
@Siddharthのリンクされた記事は、問題を解決する方法をいくつか示すことになっています。その記事に欠けている情報を見つけたら、私に知らせてください。または、この質問への回答としていつでもソリューションを提供できます。
Michal Gajdos 2015

34

サーブレット2.xを使用している場合は、サーブレットクラスが変更されるため、web.xmlで別の構成が必要になります。次の構成でweb.xmlを更新できます。

    <servlet>
    <servlet-name>myrest</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>your.package.path</param-value>
    </init-param>
    <init-param>
     <param-name>unit:WidgetPU</param-name>
     <param-value>persistence/widget</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>myrest</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>

9
実際にunit:WidgetPUが必要ですか?削除することで答えが簡単になると思います。
Nikita Bosik

1
このPARAMはジャージーの<init-param>のの<param-name>の単位とは関係ありません:WidgetPU </ PARAM名>の<param-value>の持続性/ウィジェット</ PARAM値> </ initの-param>の
vaquarカーン

22

これをpomに追加します

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
</dependency>

2
jersey-coreはjersey-serverの依存関係であり、明示的に追加する必要はありません
Kalpesh Soni 2015

OK、私たちに起こったことは、jersey-serverを1.0.2から1.11にバンプし、「ServletContainer」クラスが突然AWOLになったということです。そのバージョンと将来のバージョンでjersey-servletパッケージに移動されたようですref:developer.jboss.org/thread/221647
tstart

15

これは日食のセットアップの問題であり、ジャージーの問題ではありません。

このスレッドからClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

Eclipseプロジェクトのプロパティ->デプロイメントアセンブリ->追加-> Javaビルドパスエントリ-> Gradle依存関係->終了を右クリックします。

そのため、Apacheの起動時にEclipseはGradleの依存関係を使用していませんでした。


1
この問題に多くの時間を費やし、私の一日を救った!
Tushar Thakur 2018

3

これを試して :

org.glassfish.jersey.servlet.ServletContainer

サーブレットクラス


2

別のガイドに従いましたが、同じ問題が発生しました:http//www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

奇妙な部分は、私が使用したこのガイドでは、バージョン間の互換性(1.xと2.x)に問題はないはずです。これは、ガイドに従って、参照しているジャージ1.8.xを使用pom.xmlしているためweb.xmlです。com.sun.jersey.spi.container.servlet.ServletContainer1.xバージョンの前に述べたクラス()。だから私が推測できるように、これは機能しているはずです。

私の推測では、JDK 1.7を使用しているため、このクラスはもう存在しません。


その後、私は私の前に答えで解決しようとしましたが、助けにはなりませんでした、私はとに変更を加えpom.xmlましたweb.xmlに対してエラーを変更します:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

おそらく存在するはずです!

このエラーの結果として、私は「新しい」解決策を見つけました。 http //marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Maven(アーキタイプ)を使用して、ジャージプロジェクトを生成します。

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0

そしてそれは私のために働いた!:)


2

私も同様の問題に直面しました。以下のリンクからステップステップチュートリアルを実行することにより、問題を解決しました。

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/

  • 注意すべき主な点は、ジャージライブラリをTOMCAT WEB-INF / libフォルダーに正しく配置する必要があることです。これは、上記のリンクに記載されているEclipse設定によって自動的に行われます。依存するJARファイルを使用してWARファイルを作成します。そうしないと、ClassNotFound例外で問題が発生します。

apache-tomcat-7.0.56-windows-x64 \ apache -tomcat-7.0.56 \ webapps \ JerseyJSONExample \ WEB-INF \ lib

"11/23/2014 12:06 AM 130,458jersey-client-1.9.jar

11/23/2014 12:06 AM 458,739jersey-core-1.9.jar

11/23/2014 12:06 AM 147,952jersey-json-1.9.jar

11/23/2014 12:06 AM 713,089 jersey-server-1.9.jar "4ファイル1,450,238バイト

  • 2番目のチュートリアルでは、JSON出力を生成および消費するWebサービスを作成する方法について説明します。

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

両方のリンクは、物事がどのように機能し、多くの時間を節約するかについての良い絵を与えました。


1

ビルドパスの問題が原因でこのエラーが発生します。ビルドパスに「サーバーランタイム」ライブラリを追加する必要があります

"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"

クラスが見つからない例外を解決するには、以下の手順に従ってください。

右クリック project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

今日、Jersey 1.xを使用していて、クラスパスに適切なjarがあったにもかかわらず、同じエラーが発生しました。手紙のvogellaチュートリアルに従い、1.x jarを使用したい場合は、ジャージライブラリをWEB-INF / libフォルダーに追加する必要があります。これは確かに問題を解決します。


同じエラーが発生します(1.18.1バージョンのjersey-server、jersey-core、jersey-servletを使用)が、IntelliJ Ideaが作成する爆発したアーティファクトは、内部にclassesフォルダーとweb.xmlファイルがある単一のWEB-INFフォルダーです。ClassesフォルダにはHello.classのみが含まれます
skiabox 2014

0

jersey-bundle-1.17.1.jarプロジェクトのライブラリに追加する必要があります

<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> --> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <!-- <param-name>jersey.config.server.provider.packages</param-name> --> <param-value>package.package.test</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>


0

web.xmlで置き換える必要があります。

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

このため:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

これは、Jersey 2.xがcom.sun.jersey(Jersey 1.xで使用される)の代わりにorg.glassfish.jerseyパッケージを使用するため、例外です。また、JAX-RS2.0およびJersey2.xに移行すると、com.sun.jerseyで始まるinit-paramはJersey2.xによって認識されないことに注意してください。

いつでもmavenを使用する場合、pom.xmlは次のようになります。

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.X</version>
</dependency>

2.Xを希望のバージョンに置き換えます(例:2.15)


0

簡単な回避策は、eclipseのデプロイメントアセンブリに依存関係またはライブラリがあるかどうかを確認することです。おそらくtomcatを使用している場合、サーバーは使用しているライブラリを識別していない可能性があります。その場合は、デプロイメントアセンブリで明示的に指定してください。


0

元の問題に戻る-java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

上で正しく述べたように、JAX 2.xバージョンでは、ServletContainerクラスがパッケージ(org.glassfish.jersey.servlet.ServletContainer)に移動されました。関連するjarは、jaxrs-ri-2.2.1.zipにバンドルされているjersey-container-servlet-core.jarです。

JAX RSは、zipファイルjaxrs-ri-2.2.1.zipに含まれるすべてのjarを手動でコピーすることにより、mvnなしで実行できます(私はこのバージョンを使用しましたが、任意の2.xバージョンで動作します)にをWEB-INF / libフォルダーにで実行できます。libsを正しいフォルダーにコピーすると、実行時に使用できるようになります。

これは、Eclipseを使用してプロジェクトをビルドおよびデプロイする場合に必要です。


0

pom.xmlファイルに追加する必要があります

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>

0

同じエラーが発生し、すべてのオプションのデバッグと試行に2時間以上無駄になりました。私はMaven / POMを使用していなかったので、少数の人から提供されたソリューションを活用できませんでした。

最後に、次の問題が解決しました。jarをtomcat / lib(WEB-INF \ libではない)フォルダーに直接追加し、tomcatを再起動します。


0

誰かがJerseyを使用してHelloWorldアプリケーションを構築しようとしている場合、最も簡単な方法の1つはJerseyのドキュメントに従うことだと思います。

https://jersey.github.io/download.html

すでにMavenを使用している場合は、結果を確認するのに数分しかかかりません。

以下を使用しました。

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26

0

それは基本的にあなたが使用しているバージョンのジャージに依存します。Jersey ver.1.XXを使用している場合は、追加する必要があります

ジャージー1は「com.sun.jersey」を使用し、ジャージー2はorg.glassfishを使用します。サーブレットクラスタグ。また、com.sun.jerseyで始まるinit-paramもJersey2では認識されないことに注意してください。

そして、すべてのjarファイルをWEB-INFlibフォルダーに追加します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.