【问题标题】:java.lang.ClassNotFoundException : com.sun.faces.config.ConfigureListenerjava.lang.ClassNotFoundException : com.sun.faces.config.ConfigureListener
【发布时间】:2012-06-06 13:55:47
【问题描述】:

我们是三个开发 JSF 项目的人,我们之前没有接触过 JSF。奇怪的是,从 SVN 签出的数据相同,其中一名团队成员每次使用 Tomcat 7.0.27 时都会收到 404 错误。

Tomcat(在Eclipse内部使用)启动时,会写出如下日志:

01.06.2012 11:45:16 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: ......
01.06.2012 11:45:16 org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SnapManCloud' did not find a matching property.
01.06.2012 11:45:16 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
01.06.2012 11:45:16 org.apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
01.06.2012 11:45:16 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 677 ms
01.06.2012 11:45:16 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
01.06.2012 11:45:16 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.12
01.06.2012 11:45:17 org.apache.catalina.core.StandardContext listenerStart
FATAL: Error configuring application listener of class com.sun.faces.config.ConfigureListener
java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener
    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.StandardContext.listenerStart(StandardContext.java:4638)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
01.06.2012 11:45:17 org.apache.catalina.core.StandardContext listenerStart
FATAL: Skipped installing application listeners due to previous error(s)
01.06.2012 11:45:17 org.apache.catalina.core.StandardContext startInternal
FATAL: Error listenerStart
01.06.2012 11:45:17 org.apache.catalina.core.StandardContext startInternal
FATAL: Context [/SnapManCloud] startup failed due to previous errors
01.06.2012 11:45:17 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
01.06.2012 11:45:17 org.apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
01.06.2012 11:45:17 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1279 ms

我们使用 Mojarra 2.0.3 作为 JSF-Implementation,它已被 Eclipse 包含到项目中(并且可能包含在类路径中)。

确实在web.xml中有一个com.sun.faces.config.ConfigureListener的条目

<listener>
     <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

有没有人可以从哪里寻找错误?另外,如果需要其他信息,请告诉我。

【问题讨论】:

    标签: jsf tomcat classnotfoundexception


    【解决方案1】:

    JSF 通常捆绑在成熟的 Java EE 应用服务器中,例如 GlassFish、JBoss AS/EAP、WildFly、WebSphere、WebLogic 等。然而,Tomcat 是一个准系统 JSP/Servlet 容器,它只捆绑了 JSP 和 Servlet API,没有 JSF API。

    如果您想在 Tomcat 上使用 JSF,那么您需要将 JSF 库与 webapp 捆绑在其 /WEB-INF/lib 文件夹中,或者通过将 JSF 库放置在其 /lib 文件夹中来在 Tomcat 中安装 JSF .显然,该应用程序是为真正的 Java EE 应用程序服务器设计的,因此不会在 /WEB-INF/lib 中捆绑 JSF 库。

    有两个可用的 JSF 实现,MojarraMyFacescom.sun.faces 包表示 Mojarra,因此请下载该包并将其放在 webapp 的运行时类路径中(即在 webapp 的 /WEB-INF/lib 或 Tomcat 的 /lib 中)。


    另一个可能的原因是您将项目部署到使用 MyFaces 而不是 Mojarra 的 Java EE 应用程序服务器,而该项目显然最初是为 Mojarra 开发的。那个听众就是 Mojarra 特定的。在这种情况下,您最好从web.xml 中删除整个&lt;listener&gt; 条目。

    无论如何,Mojarra 的ConfigureListenerweb.xml 中的显式注册实际上只需要解决旧的错误服务器,例如 GlassFish v3 和 Jetty,它们无法在 Mojarra 的 TLD 文件中找到侦听器。当部署到一个像样的服务器时,整个&lt;listener&gt; 条目是不必要的。

    另见:

    【讨论】:

    • 在 Tomcat 的 /lib 中删除 JSF jar 有帮助。谢谢!
    • 您能否添加有关如何使用 Eclipse 将下载的 Mojarra .jar 添加到项目中的说明?这真的很有帮助。
    • @problemofficer:来自答案:“将它放在 webapp 的运行时类路径中(即在 webapp 的 /WEB-INF/lib 或 Tomcat 的 /lib 中)”。把它放在项目的 /WEB-INF/lib 文件夹中是通常的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2013-12-14
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多