【问题标题】:JSF how upgrade to Mojarra 2.1.21 in Netbeans7.1 (just sub jsf-api.jar and jsf-impl.jar fails)JSF 如何在 Netbeans7.1 中升级到 Mojarra 2.1.21(只是子 jsf-api.jar 和 jsf-impl.jar 失败)
【发布时间】:2013-05-18 21:28:29
【问题描述】:

我想从 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 change default 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.

感谢您的建议。

【问题讨论】:

  • 我尝试在 glassfish 替换 jsf-impl.jar 和 jsf-api.jar 后重新启动之前删除 glassfish/domains/domain1/osgi-cache 中的所有内容。 Mojarra 升级技术发生了哪些变化,新升级要求的参考/文档在哪里?
  • 我刚从 BalusC 找到这个:stackoverflow.com/questions/12792222/…“只需将 Glassfish /modules 文件夹中的 jsf-api.jar 和 jsf-impl.jar 替换为单个 javax.faces.jar 文件即可。因为Mojarra 2.1.6 的构建系统已更改为符合 Java EE Maven 规则,另请参见 issue 2028。这导致 API 和 impl 被合并到一个 JAR 文件中。java.net/jira/browse/JAVASERVERFACES-2028"
  • 我按照BalusC的建议做了,把jsf-api.jar和jsf-impl.jar都换成javax.faces.jar,但是Netbeans固执地拒绝看,javax.faces.jar不会出现在 Glassfish 服务器库(在 Netbeans7.1 中)下。我删除了 osgi-cache,我什至删除了 .netbeans/7.1/var/cache,但 Netbeans 看不到它。我收到 import javax.faces.bean.ManagedBean 之类的导入错误。
  • 我尝试在 NetBeans7.1 中删除/添加服务器,但没有帮助。我已经删除了 osgi-cache 和 NetBeans ~/.netbeans/7.1/var/cache (在 Mac OS X 上)。 NetBeans7.1 顽固地拒绝在 Glassfish 服务器库下显示 javax.faces.jar,我仍然遇到导入错误。
  • 另外,将 jsf-api.jar 和 jsf-impl.jar 替换为 javax.faces.jar 后,Netbeans7.1 将不再显示项目的框架,它会挂起。我从未如此频繁地使用 Mac OS X 的“强制退出”功能。我只是无法让 NetBeans7.1 看到 javax.faces.jar。

标签: jsf jsf-2 glassfish mojarra


【解决方案1】:

好的,我终于有 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 文件中删除任何提及 jsf-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 时遇到了多个问题,这就是为什么我如此坚决地安装 JSF Mojarra 2.1。 21 在 Netbeans7.1+Glassfish3.1.1 上。

感谢任何进一步的建议。

【讨论】:

    【解决方案2】:

    尝试以下步骤

    • here下载jsf 2.1.21 jar
    • 将其重命名为 javax.faces.jar 。
    • 备份 docroot\glassfish\modules 中的 javax.faces.jar
    • 粘贴并用下载的 javax.faces.jar 替换旧的 javax.faces.jar,该文件位于 docroot\glassfish\modules 中
    • 删除 osgi 缓存 glassfish3\glassfish\osgi 以进行更改 生效

    【讨论】:

    • 感谢 Jitesh 的建议,但这不适用于 Netbeans7.1,它没有 javax.faces.jar,它有 jsf-api.jar、jsf-impl.jar、jsf-connector。罐子,jsftemplating.jar。 Netbeans7.2(带有 Glassfish3.1.2.2)具有 javax.faces.jar,但由于与 Glassfish 3.1 使用的某些第 3 方软件(ObjectDB JPA objectdb-2.4.0_05)不兼容,我无法使用它。 2.2.像 objectdb-2.5.0_04 这样的较新版本有(引入)一些其他问题。最后,我正在尝试解决 ObjectDB 的问题,否则我只会升级 Netbeans+Glassfish。
    • 顺便说一句,我认为这可能适用于 Windows:'删除 osgi 缓存 glassfish3\glassfish\osgi'。在 Mac OS X 上,至少(默认)缓存是 .../glassfish/domains/domain1/osgi-cache,并且 .../glassfish/osgi 包含 felix 和 equinox 的配置文件。
    • 在 GlassFish 服务器 4.0 (NetBeans 7.2.1) 中从 2.2.0(随附的捆绑包)升级到 Mojarra 2.2.3 时,这对我有用。谢谢。
    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 2016-04-20
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多