jar no cargado. Consulte Servlet Spec 2.3, sección 9.7.2. Clase infractora: javax / servlet / Servlet.class

100

Estoy ejecutando un proyecto Maven que también es un proyecto web dinámico. He usado todas las bibliotecas de Spring en Maven. Lo creé web.xml, pero cuando inicio mi servidor Tomcat 7 recibo el siguiente mensaje:

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

Intenté eliminar el servlet webapp/lib, pero no funcionó. Déjeme saber qué se debe hacer en mi caso.

dreambigcoder
fuente
Tenga en cuenta que este comportamiento está de acuerdo con la especificación del servlet. Una comprensión completa es útil para comprender los problemas más complicados que pueda encontrar.
Thorbjørn Ravn Andersen

Respuestas:

113

El archivo .jar de la API del servlet no debe estar incrustado dentro de la aplicación web ya que, obviamente, el contenedor ya tiene estas clases en su classpath: implementa las interfaces contenidas en este jar.

La dependencia debe estar en el providedalcance, en lugar del compilealcance predeterminado , en su pom de Maven:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
JB Nizet
fuente
"La dependencia debe estar en el alcance proporcionado, en lugar del alcance de compilación predeterminado, en su pom de Maven". ¿Cómo puedo hacer eso?
Dreambigcoder
Vea mi respuesta editada. limpie y compile la aplicación usando Maven, y verifique que el jar del servlet no esté en el directorio WEB-INF / lib en la aplicación web generada.
JB Nizet
Yo hice todo. sin embargo, encuentro el jar en el directorio WEB-INF / lib. Si elimino el jar, recibo el siguiente mensaje INFO: Iniciando Servlet Engine: Apache Tomcat / 7.0.12 ¿Hay algo que deba hacer?
dreambigcoder
6
Tal vez tenga una dependencia que tenga una dependencia transitiva a otra versión jar de servlet. Use mvn dependency: tree para encontrar de dónde proviene este jar de servlet y agregue una exclusión.
JB Nizet
¿Cómo hago lo mismo con la hiedra?
Dinesh Babu KG
21

Recibe este mensaje de advertencia cuando el archivo jar de la API del servlet ya se ha cargado en el contenedor e intenta cargarlo una vez más desde el libdirectorio.

Las especificaciones de Servlet dicen que no se le permite tener servlet.jar en su libdirectorio de aplicaciones web .

  • Deshazte del mensaje de advertencia simplemente eliminándolo servlet.jarde tu libdirectorio.
  • Si no encuentra el jar en el libdirectorio, busque su ruta de compilación y elimine el jar.

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

Si está ejecutando un proyecto maven, cambie la javax.servlet-apidependencia al alcance provideden su pom.xml ya que el contenedor ya proporcionaba el jar de servlet en sí mismo.

Suerte
fuente
4

Para solucionarlo, establezca el alcance en proporcionado . Esto le dice a Maven que use el código servlet-api.jar solo para compilar y probar, pero NO lo incluya en el archivo WAR. El contenedor implementado "proporcionará" el servlet-api.jar en tiempo de ejecución.

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

Puede encontrar la siguiente línea de comandos de Windows útil para rastrear el archivo jar infractor. crea un índice de todos los archivos de clase en todos los frascos de la carpeta. Ejecute desde la carpeta lib de su aplicación implementada, luego busque el archivo index.txt para la clase ofensiva.

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

Alcance de dependencia de Maven

proporcionado : esto es muy parecido a la compilación, pero indica que espera que el JDK o un contenedor proporcione la dependencia en tiempo de ejecución. Por ejemplo, al crear una aplicación web para Java Enterprise Edition, establecería la dependencia en la API de Servlet y las API de Java EE relacionadas en el alcance proporcionado porque el contenedor web proporciona esas clases . Este alcance solo está disponible en la ruta de clase de compilación y prueba, y no es transitivo.

yuceel
fuente
1

He estado luchando con este problema y he probado numerosas "soluciones".

Sin embargo, al final, el único que funcionó y en realidad tardó unos segundos en hacerlo fue: eliminar y volver a agregar una nueva instancia de servidor !

Básicamente, hice clic derecho en mi servidor Tomcat en Eclipse en Servidores y lo eliminé. A continuación, agregué un nuevo servidor Tomcat. Limpié y volví a implementar la aplicación y me deshice de este error.

iaforek
fuente
Haga clic derecho en su servidor -> Limpiar ... y luego nuevamente haga clic derecho en su servidor -> Limpiar el directorio de trabajo de tomcat me lo
arregló
0

Compruebe dentro del directorio siguiente el archivo jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar si existe, entonces en este directorio de su aplicación web WEB-INF \ lib \ el-api.jar se debe quitar el frasco

Fred Ondieki
fuente
0

cuando su patrón de URL es incorrecto, puede ocurrir este error.

p.ej. Si escribió @WebServlet ("inicio de sesión"), se mostrará este error. El correcto es @WebServlet ("/ login").

Phyo Thinza
fuente
0

Las exclusiones y provideddependencias no funcionarán en proyectos secundarios.

Si está utilizando herencia en proyectos de Maven, debe incluir esta configuración en el pom.xmlarchivo principal . Tendrá una <parent>...</parent>sección en su pom.xml si está usando herencia . Entonces tendrás algo como esto en tu padre 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
fuente
0

Falta la biblioteca de dependencias JAX-WS “jaxws-rt.jar”.

Vaya aquí http://jax-ws.java.net/ . Descargue la distribución JAX-WS RI. Descomprímalo y copie "jaxws-rt.jar" en la carpeta de la biblioteca de Tomcat "{$ TOMCAT} / lib". Reinicie Tomcat.

Faiz
fuente
0

Normalmente, cuando ve este mensaje, es benigno. Si dice

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 está ignorando su servlet-api-2.5.jar porque tomcat ya tiene una versión incorporada de ese jar, por lo que no va a usar la suya. Normalmente, esto no causa ningún problema.

Si sin embargo dice WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

entonces lo que puede hacer (en mi caso, es un frasco sombreado) es ejecutar

Dependencia de $ mvn: árbol

y descubre que tienes una dependencia transitiva de "algo" que depende de un jar que es servlet-api o algo parecido (ej tomcat-servlet-api-9.0.0.:). Entonces, agregue una exclusión a eso en su pom, por ejemplo: (en mi caso, tomcat, en su caso, probablemente los mencionados en las otras respuestas):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>
Rogerdpack
fuente
-4

Eliminar servlet.jarde la web-inf/libcarpeta de origen, ya que está disponible en la libcarpeta tomcat, entonces funciona bien

Suresh Bkonda
fuente
1
Esta respuesta no agrega nada que no esté ya en esta respuesta .
Glorfindel