首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat 7.0.37 JSF应用部署ClassNotFound FacesServlet

Tomcat 7.0.37 JSF应用部署ClassNotFound FacesServlet
EN

Stack Overflow用户
提问于 2013-03-03 11:44:38
回答 1查看 7.8K关注 0票数 2
代码语言:javascript
复制
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部署应用程序时,我得到了这个堆栈跟踪。这意味着没有可用的FacesServlet,但显然并非如此,因为这些库在战争中是可用的。

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

我一点也不知道可能出了什么问题。正如标题中所述,我正在使用Tomcat 7.0.37。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-03 15:21:01

这个问题很可能与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语义加载WAR中库WAR中包含的任何资源。正如Java许可协议中所描述的那样,不属于Java产品一部分的servlet容器不应该允许应用程序覆盖Java平台类,例如java.*和javax.*名称空间中的类,而Java不允许修改这些类。容器不应该允许应用程序覆盖或访问容器的实现类。还建议实现应用程序类加载器,以便优先加载包装在WAR中的类和资源,而不是驻留在容器范围的库JAR中的类和资源。实现还必须保证,对于部署在容器中的每个web应用程序,对Thread.currentThread.getContextClassLoader()的调用都必须返回实现本节中指定的契约的ClassLoader实例。此外,ClassLoader实例必须是每个已部署的web应用程序的单独实例。在对web应用程序进行任何回调(包括侦听器回调)之前,容器必须设置前面描述的线程上下文ClassLoader,并在回调返回后将其设置为原始ClassLoader。

清理您的依赖!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15185300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档