无法在 Tomcat 7 中初始化 FacesServlet - ClassNotFoundException

Posted

技术标签:

【中文标题】无法在 Tomcat 7 中初始化 FacesServlet - ClassNotFoundException【英文标题】:Unable to initialize FacesServlet in Tomcat 7 - ClassNotFoundException 【发布时间】:2013-08-04 12:42:57 【问题描述】:

我正在 JSF 中尝试一个简单的 hello world 应用程序,但基于 tomcat 在启动时抛出的异常,我看到 FacesServlet 没有被初始化。我有所需的jar 文件myfaces-api, bundle, impl 和commons beanutils、编解码器、集合、消化器、日志记录。除此之外,我在另一个关于 SO 的问题中读到,我还需要 jsf-api.jar and jsf-impl.jar,我还把它放在 WEB-INF/lib 中并添加到构建路径中

仍然没有运气。我正在 Ubuntu 上开发,使用 Eclipse 和 Tomcat 7

这是我的web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Doom</display-name>
  <display-name>JavaServerFaces</display-name>

    <!-- Change to "Production" when you are ready to deploy -->
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <!-- Welcome page -->
    <welcome-file-list>
        <welcome-file>faces/welcome.xhtml</welcome-file>
    </welcome-file-list>

    <!-- JSF mapping -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Map these files with JSF -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>

这是个例外

java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1062)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1010)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4935)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5262)
    at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5257)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

【问题讨论】:

javax.faces-2.2.0.jar(来自repo1.maven.org/maven2/org/glassfish/javax.faces/2.2.0)添加到WEB-INF/lib为我解决了这个问题。 请注意,接受的答案是在 Tomcat 上安装 JSF 的错误方法。有关正确的方法,请参阅我们的 JSF wiki 页面:***.com/tags/jsf/info 【参考方案1】:

2 周后,我找到了答案。非常简单地一如既往。你需要复制两个

jsf-api.jar
jsf-impl.jar

致 tomcat lib。将它放在 project 库中似乎不起作用。

【讨论】:

显然您的 Eclipse 配置严重混乱。我建议为 Java EE 重新安装 Eclipse,并且不要更改其任何设置,除非您真的真正了解该设置到底在做什么。请注意,将这些库放在 Tomcat 的库中并不是一种解决方案,而是一种解决方法。真正的解决方案是将这些库放在 webapp 的/WEB-INF/lib 中。那部分不起作用是您仍然需要解决的问题。 @BalusC 感谢这个坏消息,但目前这对我有用,我真的很想学习一些 jsf :) 我希望您牢记,您不应该解决这个问题以及它对 JSF 的所有未来后果,而是应该解决糟糕的环境。您应该从一个良好的开发和运行时环境开始。【参考方案2】:

我在使用 Eclipse Juno 和 Tomcat 7 - Tomee 1.6.0 时遇到了同样的问题。

我想用mojarra 2.0.3,发现服务器部署有很多问题。我已经解决了它在 Tomcat 库中删除 myfaces-*.jar 的问题;然后在Tomcat目录中添加mojarra lib,然后启动服务器。现在一切正常,它正在运行。

经过多次配置更改,我发现真正起作用的是安装在 Tomcat 目录中的库,直接忽略了 Eclipse 配置。也许是一个错误?

我终于解决了我自己手动更改 Tomcat 库的问题。我觉得以后不会再有问题了。

【讨论】:

【参考方案3】:

此依赖项包含所需的库,可能会解决您的问题

'org.glassfish:javax.faces:2.3.0'

【讨论】:

【参考方案4】:

添加以下依赖项应该可以解决问题。我正在使用 web.xml 中的 JSF 依赖项创建一个 webapp。所以,必须在 pom.xml 中添加这些才能解决问题。

    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.1.7</version>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.1.7</version>
    </dependency>

使用您需要的任何版本。

【讨论】:

版本已经 8 年了!!!!!!因此不是最佳答案 OP 没有使用 Maven。

以上是关于无法在 Tomcat 7 中初始化 FacesServlet - ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

由于已经存在根应用程序上下文,无法初始化上下文,因此在 tomcat 中部署战争失败

无法更改tomcat 7堆大小

Tomcat 7 无法启动

Xampp 1.8.1:Apache 无法在端口 8080 中启动,该端口正被 tomcat 7 使用

初始堆大小无效。无法创建Java虚拟机

Struts2无法在可执行的战争中初始化Dispatcher - 嵌入式Tomcat