jar没有加载。 请参阅Servlet规范2.3,第9.7.2节。 违规类:javax / servlet / Servlet.class

我正在运行一个Maven项目,这也是一个dynamic的Web项目。 我已经在maven中使用了所有的spring库。 我创build了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文件不能embedded到webapp中,因为显然,容器已经在类path中包含了这些类:它实现了包含在这个jar中的接口。

依赖项应该位于Maven Pom provided范围内,而不是默认的compile范围内:

 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> 

当servlet api jar文件已经加载到容器中时,您会收到此警告消息,并尝试从lib目录再次加载它。

Servlet规范说你不允许在你的webapps lib目录中有servlet.jar

  • 通过简单地从lib目录中删除servlet.jar来摆脱警告消息。
  • 如果在lib目录中找不到jar,则扫描您的构buildpath并删除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来进行编译和testing,但不包括在WAR文件中。 部署的容器将在运行时“提供”servlet-api.jar。

 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> 

你可能会发现下面的窗口命令行有用的跟踪违规的jar文件。 它会创build文件夹中所有jar文件中所有类文件的索引。 从部署的应用程序的lib文件夹中执行,然后searchindex.txt文件以查找违规类。

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

Maven依赖范围

提供 :这很像编译,但是表示您希望 JDK容器在运行时提供依赖关系。 例如,在为Java Enterprise Edition构buildWeb应用程序时,可以将Servlet API和相关的Java EE API的依赖项设置为范围因为Web容器提供了这些类 。 此作用域仅在编译和testing类path中可用,不可传递。

如果它存在,那么在你的Web应用程序的这个目录中检查jar文件el-api.jar:C:\ apache-tomcat-7.0.39 \ lib \ el-api.jar WEB-INF \ lib \ el-api.jar该jar应该被删除

我一直在努力解决这个问题,我尝试了很多“解决scheme”。

然而,最后,唯一能够工作的实际上花了几秒钟的时间就是: 删除并添加新的服务器实例

基本上,我右键单击我的Tomcat服务器在Eclipse下的服务器,并删除它。 接下来,我添加了一个新的Tomcat服务器。 清理和重新部署的应用程序,我摆脱了这个错误。

当您的url格式错误时,可能会发生此错误。

例如。 如果您编写了@WebServlet(“login”),则会显示此错误。 正确的是@WebServlet(“/ login”)。

排除项目和provided依赖关系在子项目中不起作用。

如果您在Maven项目中使用inheritance,则必须在父pom.xml文件中包含此configuration。 如果你正在使用inheritance,你将在你的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> 

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

那么你可以做什么(在我的例子中,这是一个阴影jar)运行

$ mvn依赖:树

并发现你有一个依赖于“servlet-api”或类似jar的东西(例如tomcat-servlet-api-9.0.0 )的传递依赖。 所以给你的pom添加一个排除,例如:(在我的情况下,在你的情况下,可能是在其他答案中提到的那个):

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

从源web-inf/lib文件夹中删除servlet.jar ,因为它在tomcat lib文件夹中可用,那么它工作正常