【问题标题】:Unresolved JavaFX packages in OSGi Felix ApplicationOSGi Felix 应用程序中未解决的 JavaFX 包
【发布时间】:2015-04-28 14:08:10
【问题描述】:

我基于 JavaFX 和 OSGi Felix 容器开发了一个丰富的应用程序。当我的 JavaFX 启动时,抛出一个 org.osgi.framework.BundleException 表明框架无法连接我的 JavaFX 包:

ERROR: Bundle app-impl-bundle [3] Error starting eclipse-project:T:\workspace\fast-osgi\app-impl-bundle\ (org.osgi.framework.BundleException: Unresolved constraint in bundle app-impl-bundle [3]: Unable to resolve 3.0: missing requirement [3.0] osgi.wiring.package; (&(osgi.wiring.package=javafx.stage)(version>=2.2.0)))

这是我的 MANIFEST.MF 文件:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: app-impl-bundle
Bundle-SymbolicName: app-impl-bundle
Bundle-Version: 1.0.0.qualifier
Require-Bundle: app-bundle;bundle-version="0.0.1"
Bundle-Activator: com.mycompany.app.impl.Activator
Import-Package: javafx.stage;version="2.2.0",
 javax.xml.parsers,
 org.osgi.framework;version="1.8.0",
 org.w3c.dom,
 org.xml.sax
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ClassPath: .,
 target/lib/log4j-1.2.17.jar

这里是用于启动 OSGi 框架的 VM 参数(我在 Eclipse Luna 下运行我的项目,使用 this plugin):

-Dosgi.requiredJavaVersion=1.8 -Dorg.osgi.framework.bundle.parent=ext

最后一个参数无效。尽管this article 告诉它它适用于 Equinox...

我找到了一个将这个选项添加到 VM 参数的解决方案:

-Dorg.osgi.framework.system.packages.extra=javafx.stage

但这不是很灵活。


你认为 Felix OSGi 的实现有问题吗?它应该只适用于 Equinox 吗?任何人都可以帮助我吗?这是正确的方法吗?

【问题讨论】:

  • 虽然我对OSGi一无所知,但我很想知道为什么javafx.stage;version="2.2.0"
  • 也许e(fx)clipse 中有一些内容:“不幸的是,JavaFX 没有考虑到 OSGi,因此在 OSGi 中运行时会出现各种错误。这些问题包括 JavaFX 二进制文件在由于 OSGi 的可见性规则,您的 Java 安装和类加载问题。e(fx)clipse 提供了帮助库来处理所有这些问题,并使在 Eclipse Equinox 之上编写 JavaFX 应用程序感觉就像使用 SWT 和 Swing 一样容易。我对 OSGi 一无所知;只是引用文档。
  • @jewelsea 好的,但是由于 JDK8 JavaFX 是在 ExtClassloader 中加载的,所以理论上它应该可以工作:(
  • 您已经发现问题是 javafx.* 不是 EE 的一部分,因此 felix 需要帮助才能知道它们的存在。与使用 Equinox 的 e(fx)clipse 相比,您使用 Felix 的位置稍好一些,因为 Felix 默认将类查找委托给扩展类加载器

标签: eclipse maven javafx osgi apache-felix


【解决方案1】:

添加这两个 VM 参数为我修复了它:

-Dorg.osgi.framework.bundle.parent=ext  
-Dorg.osgi.framework.system.packages.extra=javafx.* 

【讨论】:

    【解决方案2】:

    OSGi 规范要求包必须导入所有不以“java.”开头的包。所以你确实需要导入以“javax.”开头的包。所以现在你需要一个导出器和包的来源。 -Dorg.osgi.framework.bundle.parent=ext 为您提供包的来源,因为 ext 类加载器加载器包含在包父级中。但是框架解析器仍然需要一个包的导出器才能知道包的导入是否正确解析。这就是为什么你需要-Dorg.osgi.framework.system.packages.extra=javafx.stage

    【讨论】:

    • 但是对于以 org.* (org.w3c.com, org.xml.sax) 开头的包,我不必这样做。这只带有 javafx.* 包
    • 没有太多,因为框架 impl 已将 org.osgi.framework.system.packages 设置为通常在 JRE 中找到的包集。 JavaFX 不在 JRE 中找到的常规包集中(这就是您需要使用 ext 类加载器的原因。)请参阅 svn.apache.org/repos/asf/felix/trunk/framework/src/main/…
    【解决方案3】:

    我已经发布了Drombler FX 的一些早期访问版本,这是一个新的基于 OSGi (Apache Felix) 和 Maven 的 JavaFX 富客户端平台。

    作为一个应用程序框架,它确保 JavaFX 和 OSGi 能够正确启动并提供主窗口。

    您可以在此处阅读有关 Drombler FX 的更多信息:http://puces-blog.blogspot.ch/search/label/Drombler

    有一个Getting Started 页面解释了如何通过几个简单的步骤创建、构建和运行 Drombler FX 示例应用程序。

    请注意,由于a bug in JavaFX,目前Docking Framework 中有a critical bug。不过,该错误应该在 Java SE/JavaFX 8u40 版本中修复(expected release date:2015 年 3 月)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 2016-03-08
      • 2014-03-18
      • 2016-10-03
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多