java.lang.ClassNotFoundException:com.sun.faces.config.ConfigureListener

我们是三个开发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实现,Eclipse已经包含在这个项目中(推测到类path中)。

事实上, web.xml有一个com.sun.faces.config.ConfigureListener的入口

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

有没有人有任何起点去寻找错误? 另外,如果需要更多的信息,请让我知道。

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

如果要在Tomcat上使用JSF,则需要将JSF库与/WEB-INF/lib应用程序一起捆绑到其/WEB-INF/lib文件夹中,或者将JSF库放置在其/lib文件夹中,以将其安装在Tomcat中。 显然,应用程序是为真正的Java EE应用程序服务器devise的,因此不会将/WEB-INF/lib JSF库捆绑到/WEB-INF/lib

有两个JSF实现可用, Mojarra和MyFaces 。 com.sun.faces包表示Mojarra,所以下载一个并放到webapp的运行时类path(即在webapp的/WEB-INF/lib或Tomcat的/lib )。


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

在任何情况下,在web.xml显式注册Mojarra的ConfigureListener实际上只需要解决旧的越野服务器,如GlassFish v3和Jetty无法在Mojarra的TLD文件中find监听器。 当部署到一个体面的服务器时,整个<listener>条目是不必要的。

也可以看看:

  • com.sun.faces.config.ConfigureListener的configuration
  • 当使用WASCE / Geronimo使用MyFaces时,java.lang.ClassNotFoundException:com.sun.faces.config.ConfigureListener