2
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)

When I'm trying to deploy an application with Faces Servlet, I get this stacktrace. This would mean there's no FacesServlet available, but this is clearly not the case since these libraries are available in the WAR.

  • jsf-api-2.2.0-m09.jar
  • jsf-impl-2.2.0-m09.jar
  • javaee-web-api-6.0.jar

I don't have a clue in what might be wrong. As stated in the title, I am running on Tomcat 7.0.37.

4

1 回答 1

3

问题很可能与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 SE 所做的 java.* 和 javax.* 命名空间中的类不允许修改。容器不应允许应用程序覆盖或访问容器的实现类. 还建议实现应用程序类加载器,以便优先加载 WAR 中打包的类和资源,而不是驻留在容器范围的库 JAR 中的类和资源。实现还必须保证对于部署在容器中的每个 Web 应用程序,对 Thread.currentThread.getContextClassLoader() 的调用必须返回实现本节中指定的协定的 ClassLoader 实例。此外,ClassLoader 实例必须是每个部署的 Web 应用程序的单独实例。在向 Web 应用程序进行任何回调(包括侦听器回调)之前,容器需要如上所述设置线程上下文 ClassLoader,并在回调返回后将其设置回原始 ClassLoader。

清理你的依赖!

于 2013-03-03T15:21:01.273 回答