我正在运行一个Maven项目,它也是一个动态的Web项目。我在Maven中使用了所有Spring库。我创建了web.xml
,但是当我启动我的Tomcat 7服务器时,我收到以下消息:
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
我尝试从webapp/lib
删除servlet,但它没有用。让我知道在我的案例中应该做些什么。
servlet API .jar文件不能嵌入到webapp中,因为很明显,容器在其类路径中已经有这些类:它实现了这个jar中包含的接口。
依赖关系应该在你的Maven pom中的provided
范围内,而不是默认的compile
范围:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
缺少JAX-WS依赖库“jaxws-rt.jar”。
去这里http://jax-ws.java.net/。下载JAX-WS RI发行版。解压缩并将“jaxws-rt.jar”复制到Tomcat库文件夹“{$ TOMCAT} / lib”。重启Tomcat。
通常,当您看到此消息时,它是良性的。如果它说
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
这意味着它忽略了你的servlet-api-2.5.jar,因为tomcat已经拥有该jar的内置版本,所以它不会使用你的。通常这不会导致问题。
但是,如果它说WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class
那么你可以做什么(在我的例子中,它是一个阴影罐)运行
$ mvn依赖:树
并发现你对依赖于servlet-api或类似东西的jar的“某事”具有传递依赖性(例如:tomcat-servlet-api-9.0.0
)。所以在你的pom中添加一个排除项,例如:(在我的情况下,tomcat,在你的情况下,可能是其他答案中提到的那些):
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet</artifactId>
</exclusion>
</exclusions>
</dependency>
从源servlet.jar
文件夹中删除web-inf/lib
,因为它在tomcat lib
文件夹中可用,然后它工作正常
当servlet api jar文件已经加载到容器中并且您尝试再次从lib
目录加载它时,会收到此警告消息。
Servlet规范说你不允许在你的webapps
lib
目录中拥有servlet.jar。
servlet.jar
目录中删除lib
即可删除警告消息。lib
目录中找不到jar,请扫描构建路径并删除jar。C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib
如果您正在运行maven项目,请将javax.servlet-api
依赖项更改为pom.xml中的范围provided
,因为容器本身已提供了servlet jar。
要解决此问题,请将范围设置为已提供。这告诉Maven使用代码servlet-api.jar仅用于编译和测试,但不包括在WAR文件中。部署的容器将在运行时“提供”servlet-api.jar。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
您可能会发现以下Windows命令行有助于跟踪有问题的jar文件。它会创建文件夹中所有jar中所有类文件的索引。从已部署应用程序的lib文件夹中执行,然后在index.txt文件中搜索有问题的类。
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
提供:这很像compile,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,并且不可传递。
我一直在努力解决这个问题,我尝试了很多“解决方案”。
但是,最后,唯一一个有效且实际需要几秒钟才能完成的工作是:删除并添加新的服务器实例!
基本上,我右键单击Eclipse下的Eclipse中的Tomcat服务器并将其删除。接下来,我添加了一个新的Tomcat服务器。清理并重新部署应用程序,我摆脱了这个错误。
检查以下目录中的jar文件el-api.jar:C:\ apache-tomcat-7.0.39 \ lib \ el-api.jar如果它存在,则在Web应用程序WEB-INF \ lib \的此目录中el-api.jar罐子应该被移除
当您的URL模式错误时,可能会发生此错误。
例如。如果您编写了@WebServlet(“login”),将显示此错误。正确的是@WebServlet(“/ login”)。
排除和provided
依赖项在子项目中不起作用。
如果您在Maven项目中使用继承,则必须在父pom.xml
文件中包含此配置。如果使用继承,则在pom.xml中将有一个<parent>...</parent>
部分。所以你的父母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>