WTP/JSF问题的解决--java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet

本文讨论了在使用Eclipse和Tomcat构建JSF程序时遇到的加载问题,具体为找不到javax.faces.webapp.FacesServlet类。通过分析类路径、配置和部署策略,最终解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

转自:http://babyblue2004.bokee.com/5733663.html

这几日在www.eclipse.org上看了一篇文章(http://www.eclipse.org/webtools/jsf/dev_resource/JSFTutorial-RC3/JSFTools_tutorial.html),按照上面作了一个JSF程序。出现以下问题:

严重: Error loading WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@184ec44
 javax.faces.webapp.FacesServlet
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet

 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1355)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1201)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1034)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3951)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4225)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
 at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1190)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:292)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1305)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1569)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1578)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1558)
 at java.lang.Thread.run(Unknown Source)
2006-10-8 9:51:58 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet /JSFTutorial threw load() exception
java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet

 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1355)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1201)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1034)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:932)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3951)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4225)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
 at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
 at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1190)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:292)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1305)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1569)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1578)
 at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1558)
 at java.lang.Thread.run(Unknown Source)


问题的原因似乎是没有找到javax.faces.webapp.FacesServlet,但是这个类的包我是放在classpath中的,在eclipse的"Libraries"中可以看到。这是为何?

为什么Tomcat会到WEB-INF/classes里面去找这个文件?

我花了整整一天的时间来解决这个问题。

参考了这两篇文章
1.http://dev.eclipse.org/mhonarc/lists/wtp-jsf-dev/msg00158.html
2.http://forum.java.sun.com/thread.jspa?forumID=427&threadID=598929

第一步:
    将CLASS_PATH里面的jar包部署到WEB-INF目录中。这是在项目的属性中配置的。选择“JSF Library Refererences”,选中“Deploy jars to WEB-INF/lib”。
第二步:
    这时候出现了“java.lang.NullPointerException”错误,内容为 “javax.faces.webapp.FacesServlet.init”。根据第二篇文章,出现这样的问题是因为 FactoryFinder.getFactory()工厂方法没能正确地返回相应的工厂。这是配置问题,重新配置

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

并删除<load-on-starup>1</load-on-starup>标签就可以了

ps:自己测试时,可能版本不同,未找到“JSF Library References”选项,于是直接在/WEB-INF下建/lib文件夹并负责相关jsf jar包到目录下,未出异常,可运行

<think>我们正在处理一个Eclipse错误,具体是加载项目描述符时出现IllegalValueException,指出web.xml文件中的值'4.0'不合法。根据经验,这通常与web.xml的版本声明有关。在Servlet规范中,web.xml的版本号必须与所使用的Servlet版本匹配,并且必须符合特定的DTD或Schema定义。常见的web.xml版本声明如下:对于Servlet2.3(J2EE1.3):<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">对于Servlet2.4(J2EE1.4):<web-appxmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">对于Servlet3.0(JavaEE6):<web-appxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">注意:在Servlet3.0及以后,版本号是使用version属性指定的,例如version="3.0"。而错误信息中提到的'4.0'很可能是用户错误地写了一个不存在的版本号,因为目前Servlet规范最高版本是5.0(JakartaEE9开始),但4.0并不是一个官方版本。可能的原因:1.在web.xml中,版本声明写成了4.0,而实际上并不存在4.0的Servlet规范(在JavaEE中,Servlet版本是3.0,3.1,4.0(JakartaEE8)?注意:从JavaEE转移到JakartaEE后,版本号重新开始,但Servlet4.0是存在的(对应JakartaEE8),而Servlet5.0对应JakartaEE9。然而,Eclipse可能还不支持较新的版本,或者项目配置有误。2.另一种可能是,在项目的设置中(例如org.eclipse.wst.common.project.facet.core.xml文件)指定的Servlet版本与web.xml中声明的版本不一致。解决方案:步骤1:检查web.xml文件,确认版本声明是否正确。-如果使用的是Servlet4.0(JakartaEE8),则web-app的声明应该是:<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">注意:Servlet4.0的命名空间是"http://xmlns.jcp.org/xml/ns/javaee",而JakartaEE8中Servlet4.0的命名空间已经改为"https://jakarta.ee/xml/ns/jakartaee",所以需要根据实际情况选择。-如果项目使用的是JakartaEE9(Servlet5.0),则应该使用:<web-appxmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0">步骤2:检查Eclipse中的项目Facets设置。-Eclipse中,右键项目->Properties->ProjectFacets,检查DynamicWebModule的版本是否与web.xml中声明的版本一致。-如果版本不一致,需要调整Facet版本,或者修改web.xml文件使其一致。步骤3:检查项目配置文件中关于Facet的配置。-在项目根目录下的.settings文件夹中,有一个文件名为org.eclipse.wst.common.project.facet.core.xml。-打开该文件,查看facet="jst.web"的版本,例如:<installedfacet="jst.web"version="4.0"/>这里应该与web.xml中的版本一致。步骤4:如果问题仍然存在,尝试更新Eclipse的WebToolsPlatform(WTP)插件,以确保支持Servlet4.0或更高版本。注意:如果用户使用的是较新的Servlet版本(如4.0或5.0),但Eclipse版本较旧(比如Oxygen或更早),则可能不支持。需要升级Eclipse或者使用支持JakartaEE的Eclipse版本(如Eclipse2020-06或更高版本)。另外,有时Eclipse内部缓存可能导致问题,可以尝试以下操作:-清理项目:Project->Clean-更新Maven项目(如果是Maven项目):右键项目->Maven->UpdateProject如果上述步骤不能解决问题,请提供更多的环境信息(如Eclipse版本,项目类型,web.xml文件内容等)。生成的相关问题:1.如何正确配置web.xml以支持Servlet4.0?2.Eclipse中如何修改项目Facets?3.如何升级Eclipse的WebToolsPlatform?4.在JakartaEE项目中web.xml应该如何配置?5.Eclipse出现IllegalValueException错误的其他常见原因?</think>### Eclipse加载描述符非法值异常解决方案 在加载Eclipse项目描述符时遇到`IllegalValueException`错误,提示web.xml文件中的值`'4.0'`不合法,通常是由以下原因导致的: #### 核心原因分析 1. **版本兼容性问题** `'4.0'`可能指代Servlet规范版本(如`<web-app version="4.0">`)。若Eclipse或项目运行时环境(如Tomcat)不支持Servlet 4.0规范,会触发此异常。 2. **XML语法错误** web.xml文件中存在不符合XML规范的字符或格式错误,例如: - 未闭合的标签:`<servlet>`缺少`</servlet>` - 非法字符:`<`或`&`未转义为`<`或`&` - 命名空间声明错误 3. **IDE配置冲突** Eclipse的`.settings/`目录下配置文件(如`org.eclipse.wst.common.project.facet.core.xml`)与web.xml版本声明不一致。 --- #### 解决方案步骤 ##### 1. **验证Servlet版本兼容性** - **检查web-app声明**: 打开web.xml文件,确认`<web-app>`标签的版本属性。Servlet 4.0需要Java EE 8+环境: ```xml <!-- 正确声明示例 (Servlet 4.0) --> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> ``` - **降级版本**: 若运行环境仅支持Servlet 3.1,修改为: ```xml version="3.1" xsi:schemaLocation="... http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" ``` ##### 2. **修复XML语法错误** - 使用XML验证工具(如Eclipse XML Editor)检查错误: - 快捷键:`Ctrl + Click`标签跳转到定义 - 验证:右键文件 > Validate - 常见修复: ```diff <!-- 错误示例 --> - <description>Demo & Test</description> + <description>Demo & Test</description> ``` ##### 3. **同步IDE项目配置** 1. 打开项目配置: `.settings/org.eclipse.wst.common.project.facet.core.xml` 2. 确保Facet版本一致: ```xml <facet id="jst.web" version="4.0"/> <!-- 需与web.xml的version一致 --> ``` 3. 更新项目: - 右键项目 > Maven > Update Project(Maven项目) - 或 Project > Clean ##### 4. **检查运行时环境** - **确认服务器支持性**: Servlet 4.0需Tomcat 9+、Jetty 9.4+或WildFly 13+。 -Eclipse中验证: - 打开 `Servers` 视图 - 右键服务器 > Properties > 检查`Runtime Environment` --- #### 验证步骤 1. 修改web.xml后保存文件 2. 清理Eclipse缓存:`Project > Clean` 3. 重启Eclipse 4. 重新部署项目到服务器 > **注意**:若使用旧版Eclipse(如2020-06之前),需升级IDE或安装[Java EE插件](https://marketplace.eclipse.org/content/java-ee-developer-tools)。 --- ### 相关问题 1. 如何验证web.xml文件的语法正确性? 2. Eclipse中如何修改项目的Servlet版本? 3. 哪些服务器支持Servlet 4.0规范? 4. 如何解决Eclipse项目Facet配置冲突? 5. 升级Tomcat到支持Servlet 4.0的具体步骤是什么? [^1]: Eclipse官方文档 - 项目Facet配置 [^2]: Apache Tomcat版本支持矩阵
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值