我正在为Web服务编写一个测试客户端。它是一个使用 JSF 框架的 Netbeans 6.9.1 Web 应用程序。我有一个调用 Web 服务的托管 bean。
一切正常,直到我注意到我的 bean 类名中有拼写错误。它是serviceBean,我用第一个字母大写将其重命名为ServiceBean。我使用了 Netbeans 的安全重命名功能,文件名和类签名都按预期更改。
但从那时起,我在 Glassfish 3.0.1 上运行我的应用程序时遇到了很多麻烦。
我可以从 Netbeans 构建我的应用程序而不会出错(甚至是"Clean & Build")。但是如果我部署,服务器日志中会显示以下消息:
WARNUNG: Error in annotation processing: java.lang.NoClassDefFoundError: jsf/serviceBean (wrong name: jsf/ServiceBean)
WARNUNG: WEB9052: Unable to load class jsf.ServiceBean, reason: java.lang.ClassNotFoundException: jsf.ServiceBean
INFO: Mojarra 2.0.2 (FCS b10) für Kontext '/PidClient' wird initialisiert.
SCHWERWIEGEND: Unable to load annotated class: jsf.serviceBean, reason: java.lang.NoClassDefFoundError: jsf/serviceBean (wrong name: jsf/ServiceBean)
INFO: Loading application PidClient at /PidClient
我在 facelet 页面上有一个表单,该表单将提交给我的托管 Bean。尽管存在上述错误,表单仍将加载,但如果我尝试提交它,我会收到以下错误:
WARNUNG: /index.xhtml @19,94 value="#{serviceBean.fldLname}": Target Unreachable, identifier 'serviceBean' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @19,94 value="#{serviceBean.fldLname}": Target Unreachable, identifier 'serviceBean' resolved to null
at com.sun.faces.facelets.el.TagValueExpression.getType(TagValueExpression.java:93)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:95)
at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1008)
因此,这只是由上面的NoClassDefFoundError引起的后续错误。
现在到奇怪的部分:如果我构建我的项目,它会创建文件 ServiceBean.class但是如果我从 Netbeans 部署项目,然后查看我的部署目录,该类将重命名为 serviceBean.class。
似乎部署过程重命名了该文件。
问题出在哪里?(Netbeans 6.9.1, Glassfish 3.0.1, Windows 7)
更新:它变得更好:将ServiceBean.java重命名为ServiceBean2.java。结果:如果我"清理和构建"war文件仅包含ServiceBean2.class。如果我从NB部署,则构建目录包含ServiceBean2.class和serviceBean.class。如何摆脱这个鬼魂?
我能够复制这个问题的变体。 我不得不清除 NetBeans 编译缓存(它似乎在适合大小写的操作系统上存在问题......
为了解决我遇到的问题,我必须:
-
停止服务器
-
清理项目
-
停止 NetBeans
-
删除 %HOME%.netbeans\6.9\var\cache
-
启动 NetBeans
当我运行出现问题的项目时,NetBeans 重新编译了该项目,启动了服务器并打开了索引.xhtml。 在那之后,我能够成功浏览该应用程序。
我已经打开了 http://netbeans.org/bugzilla/show_bug.cgi?id=198565 来跟踪问题。 请监视该问题,并添加您认为可以帮助尝试解决问题的人的任何信息。
我在使用 NetBeans 7.3 时遇到了非常相似的问题,这意味着它仍然没有修复。 它发生在我重命名和删除实体类之后,JPA 拒绝相信该类被删除,所以我无法部署到 Glassfish。
从重新启动 NetBeans 和 Glassfish 到实际重新安装它们,我花了好几个小时。事实证明,重新安装 NetBeans 并不能清除其缓存,这就是问题所在。
当我运行OS X时,我在~/Library/Caches/NetBeans中做了以下操作:
$ grep -r MyDeletedEntity *
嘭,很少有人提到我删除的班级!
然后,我继续删除该文件夹中的内容,重新启动 NetBeans,然后再次部署到 Glassfish。现在它工作了!
如果这不起作用,也请查看/Applications/NetBeans/NetBeans {whateverversion}.app/Content/Resources/NetBeans/nb/var/cache 并删除该文件夹中的所有内容。
太晚了,但可能会帮助别人。我刚刚意识到JRebel保留了对旧名称的引用。我为我的项目禁用了JRebel,清理和构建+运行,问题消失了。