2

我想从 Netbeans7.1(Glassfish 3.1.1)中的 JSF 实现 Mojarra 2.1.3 升级。

您可能会首先问为什么我不只是升级到 Netbeans7.3,原因包括它运行 Glassfish 3.1.2.2 并且我的 Web 应用程序中有一些其他 3rd 方软件尚未与 Glassfish 兼容3.1.1,除此之外它只有 Mojarra 2.1.6。

我过去可以通过简单地替换 /glassfish/modules 下的 jsf-api.jar 和 jsf-impl.jar 来升级 Mojarra,但这不适用于:

https://maven.java.net/content/repositories/releases/com/sun/faces/jsf-api/2.1.21/jsf-api-2.1.21.jar https://maven.java.net/content /repositories/releases/com/sun/faces/jsf-impl/2.1.21/jsf-impl-2.1.21.jar

我收到以下错误:

    SEVERE: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.enterprise.glassfish.bootstrap.GlassFishMain.main(GlassFishMain.java:97)
at com.sun.enterprise.glassfish.bootstrap.ASMain.main(ASMain.java:55)
Caused by: com.sun.enterprise.module.ResolveError: Failed to start Bundle Id [301] State [INSTALLED] [org.glassfish.web.weld-integration(Weld integration for glassfish):3.1.1]
at org.jvnet.hk2.osgiadapter.OSGiModuleImpl.start(OSGiModuleImpl.java:177)
at org.jvnet.hk2.osgiadapter.OSGiModuleImpl$2$1$1.loadClass(OSGiModuleImpl.java:344)
at com.sun.hk2.component.LazyInhabitant.loadClass(LazyInhabitant.java:124)
at com.sun.hk2.component.LazyInhabitant.fetch(LazyInhabitant.java:111)
at com.sun.hk2.component.EventPublishingInhabitant.get(EventPublishingInhabitant.java:135)
at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:76)
at org.jvnet.hk2.component.Habitat$5.get(Habitat.java:701)
at java.util.AbstractList$Itr.next(AbstractList.java:345)
at java.util.AbstractCollection.toArray(AbstractCollection.java:124)
at java.util.ArrayList.addAll(ArrayList.java:472)
at com.sun.enterprise.v3.server.SnifferManagerImpl.getSniffers(SnifferManagerImpl.java:92)
at com.sun.enterprise.v3.server.SnifferManagerImpl.getSniffer(SnifferManagerImpl.java:120)
at com.sun.enterprise.v3.server.ApplicationLifecycle.getSniffersFromApp(ApplicationLifecycle.java:2140)
at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:375)
at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:219)
at com.sun.hk2.component.AbstractCreatorImpl.inject(AbstractCreatorImpl.java:131)
at com.sun.hk2.component.ConstructorCreator.initialize(ConstructorCreator.java:91)
at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:82)
at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:67)
at com.sun.hk2.component.EventPublishingInhabitant.get(EventPublishingInhabitant.java:139)
at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:76)
at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:253)
at com.sun.enterprise.v3.server.AppServerStartup.doStart(AppServerStartup.java:145)
at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:136)
at com.sun.enterprise.glassfish.bootstrap.GlassFishImpl.start(GlassFishImpl.java:79)
at com.sun.enterprise.glassfish.bootstrap.GlassFishDecorator.start(GlassFishDecorator.java:63)
at com.sun.enterprise.glassfish.bootstrap.osgi.OSGiGlassFishImpl.start(OSGiGlassFishImpl.java:69)
at com.sun.enterprise.glassfish.bootstrap.GlassFishMain$Launcher.launch(GlassFishMain.java:117)
... 6 more
Caused by: org.osgi.framework.BundleException: Unresolved constraint in bundle org.glassfish.web.weld-integration [301]: Unable to resolve 301.0: missing requirement [301.0] package; (&(package=com.sun.faces.spi)(version>=2.1.0)) [caused by: Unable to resolve 213.1: missing requirement [213.1] package; (package=javax.faces) [caused by: Unable to resolve 211.1: missing requirement [211.1] package; (&(package=javax.el)(version>=2.2.1))]]
at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3443)
at org.apache.felix.framework.Felix.startBundle(Felix.java:1727)
at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:922)
at org.jvnet.hk2.osgiadapter.OSGiModuleImpl.start(OSGiModuleImpl.java:169)

我尝试了特定于 Web 应用程序的 JSF,但这也失败了:

glassfish 更改默认 jsf impl

添加到 web.xml:

<class-loader delegate="false" />
<property name="useBundledJsf" value="true" />

我得到错误:

Error occurred during deployment: Exception while loading the app :    
java.lang.IllegalStateException: ContainerBase.addChild: start:  
org.apache.catalina.LifecycleException: java.lang.RuntimeException: 
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! 
org.glassfish.weld.jsf.WeldFacesConfigProvider cannot be cast to 
com.sun.faces.spi.ConfigurationResourceProvider. Please see server.log for more details.

感谢您的建议。

4

2 回答 2

2

尝试以下步骤

  • 从这里下载 jsf 2.1.21 jar
  • 将其重命名为 javax.faces.jar 。
  • 备份 docroot\glassfish\modules 中的 javax.faces.jar
  • 粘贴并用 docroot\glassfish\modules 下载的 javax.faces.jar 替换旧的 javax.faces.jar
  • 删除 osgi 缓存 glassfish3\glassfish\osgi 以使更改生效
于 2013-05-23T14:02:08.310 回答
2

好的,我终于有 2 个解决方法(仅)让 Mojarra-2.1.21 与 Netbeans7.1 一起运行。

首先,据我所知,以下推荐的方法在Netbeans7.1中不起作用,它顽固地拒绝识别服务器安装的javax.faces.jar。

来自https://weblogs.java.net/blog/edburns/archive/2011/09/26/try-out-mojarra-220-snapshot?force=714

下载 javax.faces.jar 后,您必须采取一些步骤将其安装到 GlassFish 3.1 或 3.1.1 中。

从模块目录中删除 jsf-api.jar 和 jsf-impl.jar。

将 javax.faces.jar 放在模块目录中。

您必须修改 domain/domain1/config 和 lib/templates 中的 default-web.xml 文件。在每个目录中,从 default.web.xml 文件中删除对 j​​sf-api.jar 和 jsf-impl.jar 的任何提及。代替这两个 jar,添加对 javax.faces.jar 的引用。

无论我用 Netbeans7.1 做什么(无论是否清除 osgi-cache 和 netbeans 缓存,或者是否删除然后在 Netbeans7.1 中重新添加服务器,或者我重启 glassfish3.1.1 和/或 netbeans7.1 多少次), Netbeans7.1 将看不到 javax.faces.jar。

如果您尝试将 javax.faces.jar(仅)添加到您的 Web 应用程序库并在 glassfish-web.xml 中使用它以使其使用特定于 Web 应用程序的 JSF,它将防止您的 Netbeans7.1 项目中的导入错误,但它仍然不会运行:

<class-loader delegate="false" />
<property name="useBundledJsf" value="true" />

我收到此错误:

Error occurred during deployment: Exception while loading the app :   
java.lang.IllegalStateException: ContainerBase.addChild: start:   
org.apache.catalina.LifecycleException: java.lang.RuntimeException:   
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED!   
org.glassfish.weld.jsf.WeldFacesConfigProvider cannot be cast to 
com.sun.faces.spi.ConfigurationResourceProvider.

原因在这里描述:http: //java.dzone.com/articles/upgrading-latest-mojarra

问题似乎在于类路径上有两个版本的 ConfigurationResourceProvider:一个在 Web 应用程序级别(您捆绑的 jar 文件),另一个在父类加载器级别(由 GlassFish 提供)。WeldFacesConfigProvider 在父类加载器中扩展了 ConfigurationResourceProvider,但它最终将其转换为 Web 应用程序类加载器中的 ConfigurationResourceProvider。... 解决方法:将缺少的依赖项添加到您的应用程序如果您不能跨类加载器进行转换,则必须使缺少的部分可用于正确的类加载器。不替换服务器模块中的 javax.faces.jar 会导致将神奇的 WeldFacesConfigProvider 添加到您的应用程序中。它包含在 glassfish3\glassfish\modules\weld-integration.jar 中,只需将其作为附加库添加到您的应用程序中,您也可以解决问题。

您现在有 2 个解决方法选择:

  1. 在您的 Web 应用程序库中包含weld-integration.jar,并使用 glassfish-web.xml 中的 Web 应用程序 JSF 设置运行。

  2. 肮脏的把戏:在 .../glassfish/modules/javax.faces.jar 仍然存在以及您的 Web 应用程序库中的情况下,禁用或取消注释 glassfish-web.xml 中的位。然后它将与服务器 javax.faces.jar 一起运行(并将看到 /modules/weld-integration.jar),Netbeans 将看到用于导入的 Web 应用程序特定库。

这是不令人满意的,我认为这个问题没有得到完全回答。

问:如何在 NetBeans7.1 中将 JSF Mojarra 2.1.21 作为 Glassfish3.1.1 服务器 JSF 库运行?

再说一次,我不能只升级 Netbeans+Glassfish 的原因是我在使用 3.1.1 以上版本的 Glassfish 的 ObjectDB 时遇到了多个问题,这就是为什么我如此坚持要在 Netbeans7.1+ 上安装 JSF Mojarra 2.1.21 Glassfish3.1.1。

感谢任何进一步的建议。

于 2013-05-25T04:53:27.443 回答