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

86

Estou tentando construir um aplicativo simples hello world para dois dias usando o mecanismo de aplicativo Jersey + Google. Para um projeto AppEngine simples, segui estes tutoriais e ambos funcionam perfeitamente https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Mas agora estou tentando adicionar Jersey e seguindo este tutorial http://www.vogella.com/articles/REST/article.html .

Mas o servidor continua me dando

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

quando adiciono essas linhas no 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>

Tenho baixado Jersey JAX-RS 2.1 RI bundlea partir de aqui e ter adicionado todos os arquivos jar em WEB-INF/libpasta, conforme descrito no tutorial. E mesmo depois de dois dias nada está funcionando. Pesquisei várias vezes no Google e, aparentemente, as pessoas que estão usando o Maven resolveram de alguma forma, mas eu não estou usando o Maven nem o cara que escreveu aquele tutorial.

Apenas para verificar se com.sun.jersey.spi.container.servlet.ServletContainerexiste mesmo no importado Jersey jars, tentei escrever este nome totalmente qualificado em Java e deixar o intellisense terminar os nomes, mas não consegui obter nenhum intellisense depois, com.sun.jeentão meu último palpite é que houve algum rearranjo de pacote na última compilação de Jersey e jerseynão está mais dentro com.sun. Estou exausto e agradeceria qualquer tipo de ajuda.

M-WaJeEh
fonte
Como você instalou o Jersey? Não consigo acessar nada abaixo da versão 2.29 e o artigo fala sobre 2.11?
pixel

Respostas:

155

Você baixou Jersey 2 (que RI de JAX-RS 2). O tutorial ao qual você está se referindo usa Jersey 1. Baixe Jersey 1.17.1 ( aqui ), deve ser suficiente para você.

Jersey 1 usa com.sun.jerseye Jersey 2 usaorg.glassfish.jersey portanto, a exceção.

Observe também que init-paramcomeçar comcom.sun.jersey não será reconhecido por Jersey 2.

Editar

O Registro de Recursos e Provedores em Jersey 2 contém informações adicionais sobre como registrar classes / instâncias em Jersey 2.

Michal Gajdos
fonte
2
+1. Como complemento para outras pessoas com problemas semelhantes, será útil ler o Guia do Usuário oficial de Jersey: Capítulo 4. Implantando um Serviço Web RESTful
informatik01
6
nova classe para servlet-container é "org.glassfish.jersey.servlet.ServletContainer"
cljk
4
servlet-class: org.glassfish.jersey.servlet.ServletContainer, init-param-name: jersey.config.server.provider.packages.
picmate 涅
1
Essa resposta explica bem o motivo do problema / erro, mas deixa a solução em aberto. Pois, com as poucas informações que você passou não consegui resolver meu problema. Mais alguns detalhes sobre os arquivos pom.xml, web.xml e java podem fazer um trabalho melhor. Ou consulte um blog ou artigo que orienta o leitor em um tutorial para Jersey 2.x
Paulo Oliveira
1
@Siddharth, o artigo vinculado deveria mostrar algumas abordagens para resolver o problema. Se você encontrar alguma informação faltando nesse artigo, me avise. Ou você sempre pode fornecer sua solução como uma resposta a essa pergunta.
Michal Gajdos
34

Se estiver usando jersey 2.x, você precisará de uma configuração diferente no web.xml, pois a classe do servlet é alterada nele. você pode atualizar seu web.xml com a seguinte configuração.

    <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>
p27
fonte
9
Você realmente precisa da unidade: WidgetPU ? Acho que a resposta poderia ser simplificada removendo-o.
Nikita Bosik
1
Este parâmetro não está relacionado à unidade Jersey <init-param> <param-name>: WidgetPU </param-name> <param-value> persistência / widget </param-value> </init-param>
vaquar khan
22

Adicione isso no 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>
user1249655
fonte
2
jersey-core é uma dependência do jersey-server e muitos não precisam ser adicionados explicitamente
Kalpesh Soni
OK, o que aconteceu conosco é que mudamos o servidor jersey de 1.0.2 para 1.11 e a classe "ServletContainer" de repente desapareceu. Parece que foi movido nessa e em versões futuras para o pacote jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack,
15

É um problema de configuração do eclipse, não de Jersey.

Deste thread ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Clique com o botão direito do mouse em Propriedades do projeto Eclipse -> Montagem de Implementação -> Incluir -> Entradas do Caminho de Construção Java -> Dependências do Gradle -> Concluir.

Portanto, o Eclipse não estava usando as dependências do Gradle quando o Apache estava iniciando.

Adi
fonte
1
Gastei tanto tempo com esse problema, salvou meu dia
Tushar Thakur
3

tente isto:

org.glassfish.jersey.servlet.ServletContainer

na classe de servlet

Pichitron
fonte
2

Tive o mesmo problema que você, embora tenha seguido um guia diferente: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

O estranho é que, neste guia que utilizei, não devo ter nenhum problema de compatibilidade entre as versões (1.x contra 2.x) porque seguindo o guia você usa a camisa 1.8.x no pom.xmle no que web.xmlvocê se refere uma classe ( com.sun.jersey.spi.container.servlet.ServletContainer) como dito antes da versão 1.x. Portanto, posso inferir que isso deve estar funcionando.

Meu palpite é que, como estou usando o JDK 1.7, essa classe não existe mais.


Depois, tentei resolver com as respostas antes da minha, não adiantou, fiz alterações no pom.xmle no web.xmlerro mudou para:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Que supostamente deveria existir!

Como resultado desse erro, encontrei uma "nova" solução: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Com Maven (arquétipos), gere um projeto de camisa, assim:

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

E funcionou para mim! :)

Paulo Oliveira
fonte
2

Eu também enfrentei um problema semelhante. Resolvido o problema através do tutorial passo a passo no link abaixo.

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

  • A principal coisa a notar é que as bibliotecas de jersey devem ser colocadas corretamente na pasta TOMCAT WEB-INF / lib. Isso é feito automaticamente pelas configurações do Eclipse mencionadas no link acima. Ele criará um arquivo WAR com os arquivos JAR dependentes. Caso contrário, você terá problemas com a exceção ClassNotFound.

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

"23/11/2014 12h06 130.458 jersey-client-1.9.jar

23/11/2014 12h06 458.739 jersey-core-1.9.jar

23/11/2014 12h06 147.952 jersey-json-1.9.jar

23/11/2014 12:06 713.089 jersey-server-1.9.jar "4 Arquivo (s) 1.450.238 bytes

  • O segundo tutorial explica como criar um Webservice que produz e consome saída JSON.

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

Ambos os links deram uma boa imagem de como as coisas funcionam e economizam muito tempo.

yogishaj
fonte
1

Recebemos este erro devido ao problema do caminho de construção. Você deve adicionar bibliotecas " Server Runtime " no Build Path.

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

Siga as etapas abaixo para resolver a exceção de classe não encontrada.

Clique com o botão direito em project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Sachin GN
fonte
0

Encontrei o mesmo erro hoje, embora estivesse usando Jersey 1.x, e tivesse os jars certos em meu caminho de classe. Para aqueles que desejam seguir o tutorial da vogela à risca e usar os jars 1.x, você precisará adicionar as bibliotecas de camisas à pasta WEB-INF / lib. Isso certamente resolverá o problema.

Rickygrimes
fonte
Eu tenho o mesmo erro (usando a versão 1.18.1 de jersey-server, jersey-core, jersey-servlet), mas o artefato explodido que o IntelliJ Idea cria é uma única pasta WEB-INF com pasta classes dentro e arquivo web.xml.Classes pasta contém apenas o Hello.class
skiabox
0

você precisa adicionar jersey-bundle-1.17.1.jarà biblioteca do projeto

<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>

Ahmad R. Nazemi
fonte
0

Você deve substituir em seu 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>

por esta:

<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>

este é Jersey 2.x usa pacotes org.glassfish.jersey em vez de com.sun.jersey (que é usado por Jersey 1.x) e, portanto, a exceção. Observe que também init-param começando com com.sun.jersey não será reconhecido pelo Jersey 2.x depois que você migrar para JAX-RS 2.0 e Jersey 2.x

se em algum momento você usar maven, seu pom.xml seria este:

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

substitua 2.X por sua versão desejada, por exemplo, 2.15

Juan David Grisales Garzon
fonte
0

Uma solução simples é verificar se você tem dependências ou libs no conjunto de implantação do eclipse. Provavelmente, se você estiver usando o tomcat, o servidor pode não ter identificado as libs que estamos usando. nesse caso, especifique-o explicitamente no assembly de implantação.

brilho
fonte
0

Voltando ao problema original - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Como corretamente dito acima, na versão JAX 2.x, a classe ServletContainer foi movida para o pacote - org.glassfish.jersey.servlet.ServletContainer. O jar relacionado é jersey-container-servlet-core.jar que vem junto com jaxrs-ri-2.2.1.zip

JAX RS pode ser trabalhado sem mvn copiando manualmente todos os jars contidos no arquivo zip jaxrs-ri-2.2.1.zip (usei esta versão, funcionaria com qualquer versão 2.x) para a pasta WEB-INF / lib. Copiar libs para a pasta certa os torna disponíveis em tempo de execução.

Isso é necessário se você estiver usando o eclipse para construir e implementar seu projeto.

Andy1625
fonte
0

No arquivo pom.xml, precisamos adicionar

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
KARTHIKEYAN.A
fonte
0

O mesmo erro e desperdício de 2+ horas depurando e tentando todas as opções. Não estava usando o Maven / POM, então não pude aproveitar essa solução dada por poucos.

Finalmente, o seguinte resolveu: Adicionar os jars diretamente à pasta tomcat / lib (NÃO WEB-INF \ lib) e reiniciar o tomcat.

Velu
fonte
0

Se alguém está tentando construir um aplicativo hello world usando Jersey, acho que uma das maneiras mais fáceis é seguir a documentação de Jersey.

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

Se você já estiver usando o maven, levará apenas alguns minutos para ver o resultado.

Usei abaixo.

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

Basicamente, depende de qual versão de jersey você está usando. Se você estiver usando Jersey ver.1.XX, você precisa adicionar

Jersey 1 usa " com.sun.jersey " e Jersey 2 usa org.glassfish . na tag de classe de servlet. Além disso, observe que o init-param começando com com.sun.jersey não será reconhecido pelo Jersey 2.

E adicione todo o arquivo jar na pasta WEB-INF lib

Uma corrida
fonte