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 中会有一个<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>
【讨论】:
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章
关于servlet-api.jar和jsp-api.jar的选择和使用