Eclipse + Maven + JavaServer Faces - > ClassNotFoundException:StartupServletContextListener

Ale*_*uch 5 java eclipse jsf tomcat maven

摘要

当我尝试从Eclipse(在Tomcat 7.0上)运行JSF 2.0应用程序时,我得到以下异常:

Problem: SEVERE: Error configuring application listener of class org.apache.myfaces.webapp.StartupServletContextListener
java.lang.ClassNotFoundException: org.apache.myfaces.webapp.StartupServletContextListener
Run Code Online (Sandbox Code Playgroud)

细节

我正在学习使用Eclipse开发JSF应用程序.我从一个预先配置的Eclipse项目开始:File-> New-> Dynamic Web Project-> JavaServer Face v2.0 Project.使用此方法Eclipse提供所有依赖项.但我想真正了解一切是如何运作的.我想删除"魔术",所以我将我的项目转换为Maven项目:Configure-> Convert to Maven project.

然后我创建了我的pom.xml(基于http://myfaces.apache.org/build-tools/archetypes/myfaces-archetype-helloworld20/index.html),它包含以下内容:

<build>
    <finalName>jsf-facelets-tutorial</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <webXml>WebContent/WEB-INF/web.xml</webXml>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.0.5</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-impl</artifactId>
        <version>2.0.5</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

但是因为我不熟悉JSF,并且因为这是一个Eclipse"动态Web项目",所以项目结构对我来说是新的,我无法理解哪些依赖来自Maven,哪些依赖于Eclipse"魔法" ".

在Eclipse中,我的项目结构如下:

ProjectName
  JAX-WS Web Services <-- CAN I REMOVE THIS???
  Deployment Descriptor
  Java Resources
    src/main
    Libraries
      Apache Tomcat v7.0
        el-api.jar
        jsp-api.jar
        [more...]
      JSF 2.0 (Apache MyFaces JSF Core-2.0 API 2.0.2) <-- I REMOVED THIS!!!
      EAR Libraries
      JRE System Library
      Maven Dependencies
        el-api-1.0.jar
        myfaces-api-2.0.5.jar
        myfaces-impl-2.0.5.jar
        [more...]
      Web App Libraries
Run Code Online (Sandbox Code Playgroud)

问题 我的(非常基本的)应用程序(登录页面和欢迎页面)不再运行.当我执行以下操作时:

(1) Right click on WebContent/login.xhtml
(2) Run as -> Run on Server
(3) Apache Tomcat v7.0 - JDK6 at localhost
Run Code Online (Sandbox Code Playgroud)

我得到了例外:

Problem: SEVERE: Error configuring application listener of class org.apache.myfaces.webapp.StartupServletContextListener
java.lang.ClassNotFoundException: org.apache.myfaces.webapp.StartupServletContextListener
Run Code Online (Sandbox Code Playgroud)

我觉得这很容易解决,但是我对这些框架太熟悉了.

如果我应该提供任何其他详细信息(web.xml,faces-config-xml,login.xhtml),请告诉我,我会添加它们.

谢谢!

编辑

WEB-INF/lib始终为空.根据我的理解,有必要将所有依赖项复制到此文件夹中,这在运行时是必需的,而Web容器不提供这些依赖项.我空的原因是:(1)我不知道我需要什么(2)我不知道如何自动化将.jar文件放在那里的过程

vin*_*odn 7

在eclipse Project Properties下,从导航菜单中选择Deployment Assembly,它定义了"此Java EE Web应用程序项目的打包结构".确保您在此处添加了所有项目依赖项.

或者查看workspace/.metadata/.plugins/org.eclipse.wst.server.core\tmp0下的web服务器目录,检查jar是否已复制到catalina base.

  • 单击add buton,选择Java BuildPath Entries ..选择all并添加..这是eclipse选择要添加到WEB-INF/lib的所有依赖项的地方 (2认同)