我们是由三个人开发一个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包含到项目中(并可能包含在类路径中)。
事实上,有一个条目com.sun.faces.config.ConfigureListener中web.xml
com.sun.faces.config.ConfigureListener
web.xml
<listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener>
有人在寻找错误的起点吗?另外,如果需要其他信息,请告诉我。
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。显然,该应用程序是为真正的JavaEE应用程序服务器设计的,因此不会将JSF库捆绑在中/WEB-INF/lib。
/WEB-INF/lib
/lib
有两种可用的JSF实现,Mojarra和MyFaces。该com.sun.faces软件包指示Mojarra,因此请下载该软件包并将其放在webapp的运行时类路径中(即,放在webapp/WEB-INF/lib或Tomcat的路径中/lib)。
com.sun.faces
另一个可能的原因是,您将项目部署到了使用MyFaces而不是Mojarra的JavaEE应用服务器上,而该项目显然最初是为Mojarra开发的。该听众就是Mojarra特有的。在这种情况下,最好<listener>从中删除整个条目web.xml。
<listener>
在任何情况下,钻嘴鱼科的的明确登记ConfigureListener在web.xml实际上只需要要解决老马车服务器,如GlassFish的第三版和Jetty谁没有找到钻嘴鱼科的TLD文件中的监听器。当部署到体面的服务器时,整个<listener>条目都是不必要的。
ConfigureListener