jar no cargado Ver Servlet Spec 2.3, sección 9.7.2. Clase ofensiva: javax/servlet/Servlet.class
eclipse maven (12)
Estoy ejecutando un proyecto Maven que también es un proyecto web dinámico. He usado todas las bibliotecas de primavera en maven. 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
Traté de eliminar el servlet de webapp / lib, pero no funcionó. Déjame saber qué se debe hacer en mi caso.
Consulte dentro del siguiente directorio para 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 el jar debe ser eliminado
El archivo .jar de la API de 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 contenedor.
La dependencia debe estar en el alcance provided
, en lugar del alcance de compile
predeterminado, en su Maven pom:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Elimine servlet.jar
de la servlet.jar
fuente web-inf/lib
ya que está disponible en la carpeta lib
tomcat, y funciona bien.
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ímelo y copie "jaxws-rt.jar" en la carpeta de la biblioteca Tomcat "{$ TOMCAT} / lib". Reinicia Tomcat.
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 rediseñé la aplicación y me deshice de este error.
Normalmente, cuando ves 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 el suyo. Por lo general, esto no causa un problema.
Sin embargo, si dice WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class
entonces lo que puedes hacer (en mi caso, es un tarro sombreado) se ejecuta
$ mvn dependency: tree
y descubre que tiene una dependencia transitiva de "algo" que depende de un jar que sea servlet-api o algo así (ej: tomcat-servlet-api-9.0.0
). Así que agrega una exclusión a tu pom, por ejemplo: (en mi caso, tomcat, en tu caso, probablemente los mencionados en las otras respuestas):
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet</artifactId>
</exclusion>
</exclusions>
</dependency>
Obtiene este mensaje de advertencia cuando el archivo servlet api jar ya se ha cargado en el contenedor e intenta cargarlo una vez más desde el directorio lib
.
Las especificaciones de Servlet dicen que no tiene permitido tener servlet.jar en su directorio
lib
webapps.
- Deshágase del mensaje de advertencia simplemente eliminando
servlet.jar
de su directoriolib
. - Si no encuentra el jar en el directorio
lib
, explore 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 dependencia javax.servlet-api
al alcance provided
en usted pom.xml ya que el contenedor ya proporcionó el jar servlet en sí mismo.
Para solucionarlo, configure el alcance a proporcionado . Esto le dice a Maven usar el código servlet-api.jar para compilar y probar solamente, pero NO incluirlo 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>
Puede encontrar la siguiente línea de comandos de Windows útil para rastrear el archivo Jar problemático. crea un índice de todos los archivos de clase en todos los archivos jar de la carpeta. Ejecute desde dentro de la carpeta lib de su aplicación desplegada, luego busque en el archivo index.txt la clase ofensiva.
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
cuando su patrón de URL es incorrecto, este error puede ocurrir.
p.ej. Si escribió @WebServlet ("login"), se mostrará este error. El correcto es @WebServlet ("/ login").
Alcance de Dependencia de Maven
proporcionado : Esto es muy similar 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, debe establecer la dependencia de 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 el classpath de compilación y prueba, y no es transitivo.
Las exclusiones y dependencias provided
no funcionarán en proyectos secundarios.
Si está utilizando la herencia en proyectos de Maven, debe incluir esta configuración en el archivo pom.xml
principal. Tendrás una sección <parent>...</parent>
en tu pom.xml si estás utilizando la herencia . Así que tendrás algo como esto en tu pom.xml
padre:
<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>