罐子未加载。参见Servlet Spec 2.3,第9.7.2节。令人反感的类:javax / servlet / Servlet.class


100

我正在运行一个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

我尝试从中删除servlet webapp/lib,但没有用。让我知道我该怎么办。


请注意,此行为是根据Servlet规范进行的。充分理解有助于理解您可能遇到的更棘手的问题。
托尔比约恩Ravn的安德森

Answers:


113

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>

“依赖关系应该在您的Maven pom中提供的范围内,而不是默认的编译范围内。” 我该怎么做
dreambigcoder

看到我编辑的答案。使用Maven清理并构建应用程序,并检查servlet jar是否不在生成的Webapp的WEB-INF / lib目录中。
JB Nizet

我做了一切。但我在WEB-INF / lib目录中找到了jar。如果我删除了该jar,则会收到以下消息INFO:启动Servlet引擎:Apache Tomcat / 7.0.12,我需要做些什么?
dreambigcoder

6
也许您有一个对另一个servlet jar版本具有传递依赖的依赖。使用mvndependency:tree查找此servlet jar的来源,并添加排除项。
JB Nizet

我如何对常春藤做同样的事情?
Dinesh Babu KG

21

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

Servlet规范指出,不允许在webapps 目录中包含servlet.jarlib

  • 只需servlet.jarlib目录中删除即可消除警告消息。
  • 如果在lib目录中找不到jar,请扫描您的构建路径并删除jar。

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

如果您正在运行Maven项目,请更改pom.xml中的javax.servlet-api作用域范围provided,因为容器本身已经提供了servlet jar。


4

要解决此问题,请将范围设置为提供。这告诉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>

2

您可能会发现以下Windows命令行对跟踪有问题的jar文件很有用。它创建文件夹中所有jar中所有类文件的索引。从已部署应用程序的lib文件夹中执行,然后在index.txt文件中搜索有问题的类。

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

2

Maven依赖范围

提供:这很像编译,而是指你想到JDK容器,以提供在运行时的依赖。例如,在为Java Enterprise Edition构建Web应用程序时,您将对Servlet API和相关Java EE API 的依赖关系设置为提供范围因为Web容器提供了这些类。此作用域仅在编译和测试类路径上可用,并且不可传递。


1

我一直在努力解决这个问题,并且尝试了许多“解决方案”。

但是,最后,唯一可行的方法实际上是花了几秒钟来完成:删除并重新添加新的服务器实例

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


右键单击服务器->清理...,然后再次右键单击服务器->清理tomcat工作目录,为我修复了该问题
kiltek

0

检查以下目录中的jar文件el-api.jar:C:\ apache-tomcat-7.0.39 \ lib \ el-api.jar,如果存在,则在Web应用程序的此目录WEB-INF \ lib \中el-api.jar应将罐子取出


0

如果您的网址格式错误,则可能会发生此错误。

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


0

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

如果在Maven项目中使用继承,则必须在父pom.xml文件中包括此配置。如果您使用继承,则会<parent>...</parent>在pom.xml中有一个部分。因此,您的父母中将会有类似以下内容: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>

0

缺少JAX-WS依赖库“ jaxws-rt.jar”。

转到此处http://jax-ws.java.net/。下载JAX-WS RI发行版。解压缩并将“ jaxws-rt.jar”复制到Tomcat库文件夹“ {$ TOMCAT} / lib”。重新启动Tomcat。


0

通常,当您看到此消息时,它是良性的。如果说

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依赖项:tree

并发现您对“某物”有传递依赖,该某物依赖于一个servlet-api或类似的罐子(例如:)tomcat-servlet-api-9.0.0。因此,在您的pom中添加一个排除项,例如:(就我而言,tomcat,就您而言,可能是其他答案中提到的那些):

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.