102

我正在运行一个 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,但没有成功。让我知道在我的情况下应该做什么。

4

13 回答 13

114

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>
于 2013-03-24T17:23:52.573 回答
21

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

Servlet 规范说不允许在 webapps目录中包含servlet.jar 。lib

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

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

如果您正在运行一个 Maven 项目,请将javax.servlet-api依赖项更改为providedpom.xml 中的范围,因为容器本身已经提供了 servlet jar。

于 2013-05-23T09:48:27.947 回答
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>
于 2015-04-09T03:13:11.593 回答
2

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

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
于 2014-11-10T20:23:48.000 回答
2

Maven 依赖范围

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

于 2014-12-29T15:38:15.773 回答
1

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

然而,最后,唯一有效并且实际上花了几秒钟的时间完成的是:删除并重新添加新的服务器实例

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

于 2015-04-16T08:57:55.430 回答
0

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

于 2013-04-24T15:55:30.150 回答
0

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

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

于 2014-06-14T08:59:21.767 回答
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

然后你可以做什么(在我的例子中,它是一个带阴影的罐子)运行

$ 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>
于 2017-10-02T22:20:41.480 回答
0

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

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

于 2016-02-20T14:05:09.183 回答
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>
于 2015-10-19T19:50:42.350 回答
0

来自https://stackoverflow.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:treejavax.servlet:servlet-api:jar:2.5:compile 是干净的

(...)
[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
(...)
于 2021-11-24T11:25:55.300 回答
-4

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

于 2015-08-13T12:41:33.240 回答