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

Posted

技术标签:

【中文标题】jar 未加载。请参阅 Servlet 规范 2.3,第 9.7.2 节。违规类:javax/servlet/Servlet.class【英文标题】:jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 【发布时间】:2013-03-14 03:31:40 【问题描述】:

我正在运行一个 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 规范。全面了解有助于了解您可能遇到的更棘手的问题。 Error: Servlet Jar not Loaded... Offending class: javax/servlet/Servlet.class 的可能重复项 【参考方案1】:

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 中提供的范围内,而不是默认的编译范围内。"我该怎么做 查看我编辑的答案。使用 Maven 清理和构建应用程序,并检查 servlet jar 是否不在生成的 webapp 的 WEB-INF/lib 目录中。 我什么都做了。但是我在 WEB-INF/lib 目录中找到了 jar。如果我删除 jar,我会收到以下消息 INFO:正在启动 Servlet 引擎:Apache Tomcat/7.0.12 我需要做些什么吗? 也许您有一个依赖项,该依赖项具有对另一个 servlet jar 版本的传递依赖。使用 mvn dependency:tree 查找此 servlet jar 的来源,并添加排除项。 我该如何为 ivy 做同样的事情?【参考方案2】:

在以下目录中检查 jar 文件 el-api.jar :C:\apache-tomcat-7.0.39\lib\el-api.jar 如果它存在则在您的 Web 应用程序 WEB-INF 的此目录中\lib\el-api.jar jar 应该被删除

【讨论】:

【参考方案3】:

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

Servlet 规范说您不能在其中包含 servlet.jar 你的 webapps lib 目录。

只需从您的 lib 目录中删除 servlet.jar 即可消除警告消息。 如果在 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】:

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

Maven Dependency Scope

provided :这很像编译,但表明您期望 JDK容器 在运行时提供依赖。例如, 在为 Java Enterprise Edition 构建 Web 应用程序时,您 将设置对 Servlet API 和相关 Java EE API 的依赖关系 范围 provided 因为网络容器提供了这些类。 此范围仅在编译和测试类路径上可用, 并且不传递。

【讨论】:

【参考方案7】:

要修复它,请将 范围 设置为 provided。这告诉 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>

【讨论】:

【参考方案8】:

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

但是,最后,唯一有效并且实际上需要几秒钟才能完成的是:删除并重新添加新的服务器实例

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

【讨论】:

右键单击您的服务器 -> 清理...然后再次右键单击您的服务器 -> 清理 tomcat 工作目录为我修复了它【参考方案9】:

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

【讨论】:

此答案不会添加任何不在this answer 中的内容。【参考方案10】:

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

如果您在 Maven 项目中使用继承,您必须在父 pom.xml 文件中包含此配置。 如果你使用继承,你的 pom.xml 中会有一个&lt;parent&gt;...&lt;/parent&gt; 部分。所以你的父母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>

【讨论】:

【参考方案11】:

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

去这里http://jax-ws.java.net/。 下载 JAX-WS RI 发行版。 解压并将“jaxws-rt.jar”复制到Tomcat库文件夹“$TOMCAT/lib”。 重启 Tomcat。

【讨论】:

【参考方案12】:

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

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 中添加一个排除项,例如:(在我的情况下,tomcat,在您的情况下,可能是其他答案中提到的那些):

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

【讨论】:

【参考方案13】:

来自https://***.com/a/9941668/778517

我做了mvn dependency:tree,结果是

(...)
[INFO] +- org.zkoss.zk:zkspring-core:jar:3.2.0:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.7.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:3.0.7.RELEASE:compile
[INFO] |  \- org.reflections:reflections:jar:0.9.5-RC2:compile
[INFO] |     +- com.google.collections:google-collections:jar:1.0:compile
[INFO] |     +- ch.qos.logback:logback-classic:jar:0.9.9:runtime
[INFO] |     |  \- ch.qos.logback:logback-core:jar:0.9.9:runtime
[INFO] |     +- com.google.code.gson:gson:jar:1.4:compile
[INFO] |     \- javax.servlet:servlet-api:jar:2.5:compile
(...)

所以在 pom.xml,zkspring-core 我添加了排除标签

(...)
             <groupId>org.zkoss.zk</groupId>
             <artifactId>zkspring-core</artifactId>
             <version>3.2.0</version>
+            <exclusions>
+                <exclusion>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                </exclusion>
+            </exclusions>
             </dependency>
(...)

在我运行 mvn dependency:tree 和 javax.servlet:servlet-api:jar:2.5:compile is clean 之后

(...)
[INFO] +- org.zkoss.zk:zkspring-core:jar:3.2.0:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.7.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-asm:jar:3.0.7.RELEASE:compile
[INFO] |  +- org.springframework:spring-web:jar:3.0.7.RELEASE:compile
[INFO] |  \- org.reflections:reflections:jar:0.9.5-RC2:compile
[INFO] |     +- com.google.collections:google-collections:jar:1.0:compile
[INFO] |     +- ch.qos.logback:logback-classic:jar:0.9.9:runtime
[INFO] |     |  \- ch.qos.logback:logback-core:jar:0.9.9:runtime
[INFO] |     \- com.google.code.gson:gson:jar:1.4:compile
(...)

【讨论】:

以上是关于jar 未加载。请参阅 Servlet 规范 2.3,第 9.7.2 节。违规类:javax/servlet/Servlet.class的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 7 WAR 部署 - “jar 未加载”

servlet规范

关于servlet-api.jar和jsp-api.jar的选择和使用

OSError: octave-cli 未找到,请参阅 README

加载maven时报错求助

vbscript 数据加载映射 - 请参阅参数