罐子没装。请参阅Servlet规范2.3,第9.7.2节。违规类:javax / servlet / Servlet.class

时间:2013-03-24 17:12:21

标签: java eclipse maven tomcat7

我正在运行一个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,但它没有用。让我知道在我的案例中应该做些什么。

12 个答案:

答案 0 :(得分:107)

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>

答案 1 :(得分:21)

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

  

Servlet规范说您不允许 servlet.jar   您的webapps 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依赖项更改为pom.xml中的范围provided,因为容器本身已经提供了servlet jar。

答案 2 :(得分: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>

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

Maven Dependency Scope

  

提供:这与编译非常相似,但表示 期望 JDK 容器在运行时提供依赖项。例如,   在为Java Enterprise Edition构建Web应用程序时,您   将设置依赖于 Servlet API 和相关的Java EE API   范围提供,因为 Web容器提供了这些类 。   此范围仅适用于编译和测试类路径,   而且不是传递性的。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

我一直在努力解决这个问题,而且我已经尝试了很多&#34;解决方案&#34;。

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

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

答案 7 :(得分:0)

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

例如。如果您编写@WebServlet(&#34; login&#34;),将显示此错误。正确的是@WebServlet(&#34; / login&#34;)。

答案 8 :(得分:0)

排除项和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>

答案 9 :(得分:0)

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

到这里delayed loading。 下载JAX-WS RI发行版。 解压缩并将“jaxws-rt.jar”复制到Tomcat库文件夹“{$ TOMCAT} / lib”。 重启Tomcat。

答案 10 :(得分: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 dependency:tree

并发现你对&#34;某事物有过敏依赖性。这取决于一个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>

答案 11 :(得分:-4)

从源// foo.js define(function(){ return function(){ return new Promise(function(resolve, reject){ // Do async stuff. Call resolve/reject accordingly }); }; }); // bar.js define(function(){ return function(){ return new Promise(function(resolve, reject){ // Do async stuff. Call resolve/reject accordingly }); }; }); // Your code (Excuse the CommonJS format. Personal preference) define(function(require){ // Require both functions var foo = require('foo'); var bar = require('bar'); // Use them foo(...).then(function(response){ return bar(); }).then(function(){ // all done });; }); 文件夹中删除servlet.jar,因为它在tomcat web-inf/lib文件夹中可用,然后它可以正常工作