eclipse java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18239503/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 21:04:57  来源:igfitidea点击:

java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

eclipsemaventomcat7

提问by user2632444

Im trying to integrate spring with JSF and I added the following in web.xml,

我试图将 spring 与 JSF 集成,并在 web.xml 中添加了以下内容,

<listener>  
<listener-class>
   org.springframework.web.context.ContextLoaderListener
</listener-class>  
</listener>  

<listener> 
<listener-class>
 org.springframework.web.context.request.RequestContextListener
</listener-class>    
</listener> 

I have also added spring-web and common logging in my tomcat classpath in eclipse

我还在 Eclipse 的 tomcat 类路径中添加了 spring-web 和通用日志记录

There are no build errors , but while running on tomcat 7 im getting the following error,

没有构建错误,但是在 tomcat 7 上运行时出现以下错误,

  java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)

and

   java.lang.NoClassDefFoundError: javax/servlet/ServletRequestListener
at java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)

These are my settings,

这些是我的设置,

  • There is a servlet-api jar in tomcat lib

  • In my Pom.xml I have given

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>compile</scope>
    </dependency> 
    
     and            
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
        </dependency> 
    
  • tomcat lib中有一个servlet-api jar

  • 在我的 Pom.xml 中,我给出了

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>compile</scope>
    </dependency> 
    
     and            
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
        </dependency> 
    

I have tried commenting out the entry in pom.xml also this also but no luck. Any help will be appreciated.

我也试过注释掉 pom.xml 中的条目,这也是,但没有运气。任何帮助将不胜感激。

This is my pom.xml,

这是我的 pom.xml,

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>TimeTracker</groupId>
<artifactId>TimeTracker</artifactId>
<version>0.0.1-SNAPSHOT</version>

<repositories>
    <repository>
        <id>prime-repo</id>
        <name>PrimeFaces Maven Repository</name>
        <url>http://repository.primefaces.org</url>
    </repository>

    <repository>
<id>Java.Net</id>
<url>http://download.java.net/maven/2/</url>
 </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>

    <!-- J2ee -->

          <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>6.0</version>
             <scope>provided</scope> 
        </dependency> 

    <!-- Spring framework -->

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>3.2.3.RELEASE</version>
        <scope>provided</scope>
    </dependency> 

<!-- JSR-330 -->
     <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency> 

    <!-- PrimeFaces -->
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>3.5</version>
    </dependency>


    <!-- JSF -->
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.1.13</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.1.13</version>
        <scope>provided</scope>
    </dependency>

     <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency> 

      <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>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

and the other thing I have noticed is the jar files which gets copied during deployment. Im running the project in tomcat 7 in eclipse. This is the entries in deployment assembly /src WEB-INF/classes /WebContent / JSF 2.1 (Apache MyFaces 2.1.5) WEB-INF/lib

我注意到的另一件事是在部署期间复制的 jar 文件。我在 Eclipse 中的 tomcat 7 中运行该项目。这是部署程序集 /src WEB-INF/classes /WebContent / JSF 2.1 (Apache MyFaces 2.1.5) WEB-INF/lib 中的条目

is it ok? or do I have to add maven dependencies also?.but on adding maven dependencies a error mark appears on the project and on maven -> project update. The cross error and the maven dependency entry also disappears on update. Wel, I am trying to integrate JSF with spring

可以吗?还是我还必须添加 maven 依赖项?。但是在添加 maven 依赖项时,项目和 maven -> 项目更新上会出现错误标记。交叉错误和 maven 依赖项也会在更新时消失。好吧,我正在尝试将 JSF 与 spring 集成

Thanks, Pegasus

谢谢,飞马

回答by saurav

As a standard practice you should not bundle any servlet related jars with your war file , let your app server (in your case it is tomcat) provide the required classes at runtime.

作为标准做法,您不应将任何与 servlet 相关的 jar 与您的 war 文件捆绑在一起,让您的应用服务器(在您的情况下是 tomcat)在运行时提供所需的类。

Change the scope to provided ,bundle your war file again and try to deploy.

将范围更改为提供的,再次捆绑您的War文件并尝试部署。

    <scope>provided</scope>

回答by Robert Scholte

The servlet-api is a classic example of a dependency which should have the providedscope, see Introduction to dependency mechanism.

servlet-api 是应该具有provided范围的依赖项的经典示例,请参阅依赖机制简介