jar não carregado. Consulte Servlet Spec 2.3, seção 9.7.2. Classe ofensiva: javax / servlet / Servlet.class

100

Estou executando um projeto Maven que também é um projeto web dinâmico. Usei todas as bibliotecas do Spring no Maven. Eu criei web.xml, mas quando inicio meu servidor Tomcat 7, recebo a seguinte mensagem:

INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Tentei excluir o servlet de webapp/lib, mas não funcionou. Deixe-me saber o que deve ser feito no meu caso.

codificador de sonhos
fonte
Observe que esse comportamento está de acordo com a especificação do servlet. Um entendimento completo é útil para entender os problemas mais complicados que você pode encontrar.
Thorbjørn Ravn Andersen

Respostas:

113

O arquivo .jar da API do servlet não deve ser embutido no webapp, pois, obviamente, o contêiner já possui essas classes em seu classpath: ele implementa as interfaces contidas neste jar.

A dependência deve estar no providedescopo, em vez do compileescopo padrão , em seu pom Maven:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
JB Nizet
fonte
"A dependência deve estar no escopo fornecido, em vez do escopo de compilação padrão, em seu pom Maven." Como posso fazer isso
dreambigcoder
Veja minha resposta editada. limpe e construa o aplicativo usando o Maven e verifique se o jar do servlet não está no diretório WEB-INF / lib no webapp gerado.
JB Nizet
Eu fiz tudo. ainda estou encontrando o jar no diretório WEB-INF / lib. Se eu remover o jar, recebo a mensagem INFO: Iniciando Servlet Engine: Apache Tomcat / 7.0.12 Há algo que eu preciso fazer?
dreambigcoder
6
Talvez você tenha uma dependência que tenha uma dependência transitiva de outra versão do jar do servlet. Use mvn dependency: tree para descobrir de onde este jar de servlet vem e adicione uma exclusão.
JB Nizet
como faço o mesmo para ivy?
Dinesh Babu KG
21

Você recebe esta mensagem de aviso quando o arquivo jar da API do servlet já foi carregado no contêiner e você tenta carregá-lo novamente do libdiretório.

As especificações do Servlet dizem que você não tem permissão para ter servlet.jar em seu libdiretório webapps .

  • Livre-se da mensagem de aviso simplesmente removendo servlet.jardo seu libdiretório.
  • Se você não encontrar o jar no libdiretório, procure seu caminho de construção e remova o jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Se você estiver executando um projeto maven, altere a javax.servlet-apidependência para o escopo providedem seu pom.xml, uma vez que o contêiner já forneceu o jar do servlet em si.

Por sorte
fonte
4

Para corrigir isso, defina o escopo como fornecido . Isso diz ao Maven para usar o código servlet-api.jar apenas para compilar e testar, mas NÃO incluí-lo no arquivo WAR. O contêiner implementado irá “fornecer” o servlet-api.jar no tempo de execução.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
Sandeep Kumar
fonte
2

Você pode achar a seguinte linha de comando do Windows útil para rastrear o arquivo jar ofensivo. ele cria um índice de todos os arquivos de classe em todos os jars da pasta. Execute de dentro da pasta lib de seu aplicativo implantado e, em seguida, pesquise o arquivo index.txt para a classe ofensiva.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
Chris Nava
fonte
2

Escopo de dependência Maven

fornecido : é muito parecido com compilar, mas indica que você espera que o JDK ou um contêiner forneça a dependência no tempo de execução. Por exemplo, ao construir um aplicativo da web para o Java Enterprise Edition, você configuraria a dependência da API Servlet e APIs Java EE relacionadas para o escopo fornecido porque o contêiner da web fornece essas classes . Este escopo está disponível apenas no classpath de compilação e teste e não é transitivo.

yuceel
fonte
1

Tenho lutado com esse problema e tentei várias "soluções".

No entanto, no final, a única que funcionou e levou alguns segundos para fazer isso foi: deletar e adicionar de volta a nova instância do servidor !

Basicamente, cliquei com o botão direito do mouse em meu servidor Tomcat no Eclipse em Servidores e o excluí. Em seguida, adicionei um novo servidor Tomcat. Limpei e reimplantei o aplicativo e me livrei deste erro.

iaforek
fonte
Clique com o botão direito do mouse no seu servidor -> Limpar ... e clique novamente com o botão direito do mouse no servidor -> limpar o diretório de trabalho do tomcat corrigido para mim
kiltek
0

Verifique dentro do seguinte diretório o arquivo jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar se ele existe neste diretório de seu aplicativo da web WEB-INF \ lib \ el-api.jar o jar deve ser removido

Fred Ondieki
fonte
0

quando o seu padrão de URL está errado, esse erro pode ocorrer.

por exemplo. Se você escreveu @WebServlet ("login"), esse erro será mostrado. O correto é @WebServlet ("/ login").

Phyo Thinza
fonte
0

Exclusões e provideddependências não funcionarão em projetos filho.

Se você estiver usando herança em projetos Maven, deverá incluir esta configuração no pom.xmlarquivo pai . Você terá uma <parent>...</parent>seção em seu pom.xml se estiver usando herança . Então você terá algo assim em seu pai pom.xml:

<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
lmiguelmh
fonte
0

A biblioteca de dependência JAX-WS “jaxws-rt.jar” está ausente.

Clique aqui http://jax-ws.java.net/ . Faça download da distribuição JAX-WS RI. Descompacte-o e copie “jaxws-rt.jar” para a pasta da biblioteca do Tomcat “{$ TOMCAT} / lib“. Reinicie o Tomcat.

Faiz
fonte
0

Normalmente, quando você vê essa mensagem, é benigna. Se diz

INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded. 
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

Significa que ele está ignorando seu servlet-api-2.5.jar porque o tomcat já tem uma versão embutida desse jar, então não vai usar a sua. Normalmente, isso não causa um problema.

Se, no entanto, diz WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

então o que você pode fazer (no meu caso, é um jarro sombreado) é executar

Dependência de $ mvn: árvore

e descobrir que você tem uma dependência transitiva de "algo" que depende de um jar que é servlet-api ou algo parecido (ex:) tomcat-servlet-api-9.0.0. Portanto, adicione uma exclusão a isso ao seu pom, ex: (no meu caso, tomcat, no seu caso, provavelmente os mencionados nas outras respostas):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>
rogerdpack
fonte
-4

Remova servlet.jarda web-inf/libpasta de origem , pois está disponível na libpasta tomcat, então funciona bem

Suresh Bkonda
fonte
1
Esta resposta não adiciona nada que já não esteja nesta resposta .
Glorfindel