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


85

Jersey + Google 앱 엔진을 사용하여 이틀 동안 간단한 hello world 애플리케이션을 빌드하려고합니다. 간단한 AppEngine 프로젝트의 경우이 자습서를 따랐으며 둘 다 잘 작동합니다. https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

하지만 지금은 Jersey를 추가하고 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 파일을 추가 했습니다. 그리고 이틀이 지난 후에도 아무것도 작동하지 않습니다. 나는 Google에서 여러 번 검색했으며 Maven을 사용하는 사람들이 어떻게 든 해결했지만 Maven을 사용하지 않고 해당 자습서를 작성한 사람도 마찬가지입니다.WEB-INF/lib

com.sun.jersey.spi.container.servlet.ServletContainer가져온 파일에 존재 하는지 확인 Jersey jars하기 위해이 정규화 된 이름을 Java로 작성하고 intellisense가 이름을 완성하도록했지만 intellisense를 얻을 수 없었기 com.sun.je때문에 마지막 추측은 최신 Jersey 빌드에서 패키지 재 배열 이 있었다는 것입니다. 그리고 jersey더 이상 내부에 없습니다 com.sun. 나는 지 쳤고 어떤 종류의 도움을 주시면 감사하겠습니다.


Jersey는 어떻게 설치 했습니까? 2.29 버전 이하의 항목에 액세스 할 수 없으며 2.11에 대한 기사가 언급되어 있습니까?
픽셀

답변:


154

Jersey 2 (JAX-RS 2의 RI)를 다운로드했습니다. 참조하는 튜토리얼은 Jersey 1을 사용합니다. ( 여기 ) 에서 Jersey 1.17.1을 다운로드 하면 충분합니다.

Jersey 1은를 사용 com.sun.jersey하고 Jersey 2는 org.glassfish.jersey예외를 사용 합니다.

또한로 init-param시작하는 com.sun.jersey것은 Jersey 2에서 인식되지 않습니다.

편집하다

Jersey 2에서 리소스 및 공급자 등록 에는 Jersey 2에서 클래스 / 인스턴스를 등록하는 방법에 대한 추가 정보가 포함되어 있습니다.


2
+1. 유사한 문제가있는 다른 사용자를 위해 추가로 공식 Jersey 사용자 가이드 : 4 장. RESTful 웹 서비스 배포
informatik01

6
servlet-container의 새 클래스는 "org.glassfish.jersey.servlet.ServletContainer"입니다.
cljk 2014 년

4
servlet-class : org.glassfish.jersey.servlet.ServletContainer, init-param-name : jersey.config.server.provider.packages.
picmate 涅 2014

1
이 답변은 문제 / 오류의 원인을 잘 설명하지만 솔루션은 매우 개방적입니다. 왜냐하면 당신이 제공 한 작은 정보로는 문제를 해결할 수 없었기 때문입니다. pom.xml, web.xml 및 java 파일에 대한 자세한 내용은 더 나은 작업을 수행 할 수 있습니다. 또는 독자를 Jersey 2.x에 대한 자습서로 안내하는 블로그 나 기사를 참조하십시오
Paulo Oliveira

1
@Siddharth 링크 된 기사는 문제를 해결하는 방법을 보여 주어야했습니다. 해당 기사에서 누락 된 정보를 찾으면 알려주십시오. 또는 항상이 질문에 대한 답으로 솔루션을 제공 할 수 있습니다.
마이클 Gajdos

34

jersey 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 2015 년

1
이 매개 변수는 Jersey <init-param> <param-name> unit : WidgetPU </ param-name> <param-value> 지속성 / 위젯 </ param-value> </ init-param>과 관련이 없습니다.
vaquar khan

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
저지 코어는 저지 서버 많은하지 명시 적으로 추가 할 필요의 종속성입니다
Kalpesh SONI

우리에게 일어난 일은 jersey-server를 1.0.2에서 1.11로 올렸고 "ServletContainer"클래스가 갑자기 AWOL이되었습니다. 해당 버전과 향후 버전에서 jersey-servlet 패키지로 이동 한 것 같습니다. ref : developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

Jersey 문제가 아니라 일식 설정 문제입니다.

이 스레드에서 ClassNotFoundException : com.sun.jersey.spi.container.servlet.ServletContainer

Eclipse 프로젝트 속성-> 배포 어셈블리-> 추가-> Java 빌드 경로 항목-> Gradle 종속성-> 마침을 마우스 오른쪽 버튼으로 클릭합니다.

따라서 Eclipse는 Apache를 시작할 때 Gradle 종속성을 사용하지 않았습니다.


1
이 문제에 너무 많은 시간을 소비하여 하루를 절약했습니다!
Tushar Thakur

3

이 시도 :

org.glassfish.jersey.servlet.ServletContainer

서블릿 클래스


2

http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/ 다른 가이드를 따랐지만 나는 당신과 같은 문제가있었습니다 .

이상한 부분은 당신의 저지에 1.8.x를 사용 가이드 다음 때문에이 버전 간의 호환성 (2.X에 대한 1.x에서) 어떤 문제가 안된다,이 설명서에 내가 사용하고, 그입니다 pom.xml및에 web.xml당신이 참조 com.sun.jersey.spi.container.servlet.ServletContainer1.x 버전 이전에 언급 한 클래스 ( ). 그래서 내가 추론 할 수 있듯이 이것이 작동해야합니다.

내 생각 엔 JDK 1.7을 사용하고 있기 때문에이 클래스는 더 이상 존재하지 않습니다.


그 후, 나는 내 대답으로 해결하려고 노력했지만 도움이되지 않았으며 오류를 다음 pom.xmlweb.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 (archetypes)을 사용하여 저지 프로젝트를 생성하십시오.

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

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

2014 년 11 월 23 일 오전 12:06 458,739 jersey-core-1.9.jar

2014 년 11 월 23 일 오전 12:06 147,952 jersey-json-1.9.jar

2014/11/23 12:06 AM 713,089 jersey-server-1.9.jar "4 개 파일 1,450,238 바이트

  • 두 번째 자습서에서는 JSON 출력을 생성하고 소비하는 웹 서비스를 만드는 방법에 대해 설명합니다.

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

두 링크 모두 작동 방식에 대한 좋은 그림을 제공하고 많은 시간을 절약했습니다.


1

빌드 경로 문제로 인해이 오류가 발생합니다. 빌드 경로에 " Server Runtime "라이브러리를 추가해야합니다 .

"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를 사용하고 있었지만 오늘 같은 오류가 발생했으며 클래스 경로에 올바른 항아리가 있습니다. 편지에 vogella 튜토리얼을 따르고 1.x jars를 사용하려는 사람들은 저지 라이브러리를 WEB-INF / lib 폴더에 추가해야합니다. 이것은 확실히 문제를 해결할 것입니다.


동일한 오류 (jersey-server, jersey-core, jersey-servlet의 1.18.1 버전 사용)가 있지만 IntelliJ Idea가 생성하는 폭발 된 아티팩트는 내부에 클래스 폴더와 web.xml 파일이있는 단일 WEB-INF 폴더입니다. 폴더 만 Hello.class을 포함
skiabox

0

jersey-bundle-1.17.1.jar프로젝트의 lib에 추가해야합니다.

<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 패키지를 사용하므로 예외입니다. com.sun.jersey로 시작하는 init-param도 JAX-RS 2.0 및 Jersey 2.x로 마이그레이션하면 Jersey 2.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을 사용하지 않았기 때문에 소수가 제공 한 솔루션을 활용할 수 없었습니다.

마지막으로 다음이 해결했습니다. tomcat / lib (WEB-INF \ lib가 아님) 폴더에 jars를 직접 추가하고 tomcat 을 다시 시작합니다.


0

누군가 Jersey를 사용하여 hello world 애플리케이션을 빌드하려는 경우 가장 쉬운 방법 중 하나는 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를 사용하는 경우 다음을 추가해야합니다.

Jersey 1은 " com.sun.jersey "를 사용하고 Jersey 2는 org.glassfish를 사용 합니다 . 서블릿 클래스 태그에. 또한 com.sun.jersey로 시작하는 init-param도 Jersey 2에서 인식되지 않습니다.

그리고 모든 jar 파일을 WEB-INF lib 폴더에 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.