Tomcat 7.0.37 JSF应用程序部署ClassNotFound FacesServlet

时间:2013-03-03 11:44:38

标签: jsf maven tomcat7 classnotfound

Mar 03, 2013 12:09:05 PM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet Faces Servlet as unavailable
Mar 03, 2013 12:09:05 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /mavenproject1 threw load() exception
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:527)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:137)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5033)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5317)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:657)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1637)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    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:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

当我尝试使用Faces Servlet部署应用程序时,我得到了这个堆栈跟踪。 这意味着没有可用的FacesServlet,但显然不是这种情况,因为这些库在WAR中可用。

  • JS​​F-API-2.2.0-m09.jar
  • JS​​F的参数impl-2.2.0-m09.jar
  • 的JavaEE-web的API-6.0.jar

我对可能出错的地方一无所知。正如标题中所述,我正在运行Tomcat 7.0.37。

1 个答案:

答案 0 :(得分:2)

问题最有可能是javaee-web-api-6.0.jar。这个jar包含javax.servlet.*个类。当Tomcat在这个jar中找到它们时,它会阻止jar进行类加载。这意味着根本不能加载来自这个jar的类!包括其中的javax.faces.webapp.FacesServlet。请参阅servlet规范(3.0),第10.7.2节:

  

容器用于在WAR中加载servlet的类加载器必须允许开发人员使用getResource按照正常的Java SE语义加载WAR中的库JAR中包含的任何资源。 如Java EE许可协议中所述,不属于Java EE产品的servlet容器不应允许应用程序覆盖Java SE平台类,例如java。*和javax。*命名空间中的那些类, Java SE不允许修改。容器不应允许应用程序覆盖或访问容器的实现类。还建议实现应用程序类加载器,以便加载WAR中打包的类和资源,优先于驻留在容器范围的库JAR中的类和资源。实现还必须保证对于部署在容器中的每个Web应用程序,对Thread.currentThread.getContextClassLoader()的调用必须返回一个实现本节中指定的契约的ClassLoader实例。此外,ClassLoader实例必须是每个已部署的Web应用程序的单独实例。在对Web应用程序进行任何回调(包括侦听器回调)之前,容器需要如上所述设置线程上下文ClassLoader,并在回调返回后将其设置回原始的ClassLoader。

清理你的依赖项!