【问题标题】:Using JavaFX 2.2 in OSGi bundle在 OSGi 包中使用 JavaFX 2.2
【发布时间】:2012-10-25 19:16:40
【问题描述】:

如何在 OSGi 包中使用 JavaFX 2.2?我正在使用 Apache Felix,所以它不是 eclispe 项目。它必须在安装了 Java7 的 Mac OSX 上运行(Java6 很酷但不是必需的)。

我已经阅读了一些关于重新打包 jfx 库但针对 eclispe 插件项目的内容。

仅在 bundle Manifest 中导入 javafx 包创建了缺少需求 osgi.wiring.package 异常。

【问题讨论】:

    标签: osgi javafx-2 apache-felix


    【解决方案1】:

    尝试使用 e(fx)clipse 运行时工具,其中包含允许 JavaFX 在 OSGi 环境中正常工作的库。

    根据e(fx)clipse site

    不幸的是,JavaFX 在编写时并未考虑到 OSGi,因此在 OSGi 中运行时会出现各种问题,从 JavaFX-Binaries 位于用户系统的某个位置,到由于以下原因导致类加载出现问题OSGi 的可见性规则。 e(fx)clipse 提供了帮助库来处理所有这些问题,并使在 Eclipse Equinox 上编写 JavaFX 应用程序就像使用 SWT 和 Swing 一样容易

    【讨论】:

    • 但我没有使用 SWT 和 eclipse equinox。难道没有更通用的方法来创建这样的 OSGi 辅助库吗?
    • 我建议您在e(fx)clipse forum上提问
    • OSGi Bundle 中的 JavaFX 仍然有点棘手。 e(fx)clipse 插件正在与 equinox 一起使用,但我没有让它与 apache Felix 一起使用,所以我不得不将 javafx 类添加到 boot-classloader 而不是 osgi-bundle。希望进一步的 FX 版本会在这里改进。
    【解决方案2】:

    不与 JavaFX 捆绑,但将 javafx 类添加到引导类加载器将起作用。 Apache Felix 示例:

    Map<String,String> properties = new HashMap<String, String>();
    properties.put(Constants.FRAMEWORK_BOOTDELEGATION, "javafx.*,com.sun.javafx.*");
    properties.put(Constants.FRAMEWORK_BUNDLE_PARENT, Constants.FRAMEWORK_BUNDLE_PARENT_APP);
    
    FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory();
    org.osgi.framework.launch.Framework framework = factory.newFramework(properties);
    framework.init();
    

    现在只需使用任何包中的 javafx 类(如果客户端计算机上安装了 JavaFX)。

    【讨论】:

    • 这是一个好方法。只需要修改你的 OSGI 容器配置而不需要额外的代码就可以做到这一点吗?
    • 可以使用 Apache Karaf 尝试修改 /etc 目录中的 jre.properties 文件吗?
    【解决方案3】:

    现在帮助您可能有点晚了,但我想记录一种在 OSGi 环境中启用 JavaFX 的简单方法,以防像我这样的任何人仍然遇到困难......

    问题是,您需要允许 JavaFX 能够加载和使用它想要的任何类(JavaFX 使用 JRE 的内部结构,这使得它很难捆绑),所以您真正想要的是授予它访问权限到 OSGi boostraping 类路径...

    我不是专家,但在这篇博客中,来自 SpringSource 的 Costin Leau 以 3 种不同的方式解释了如何做到这一点(对于假定完全访问系统类加载器的任何 jar,而不仅仅是 JavaFX):

    http://blog.springsource.org/2009/01/19/exposing-the-boot-classpath-in-osgi/

    我选择使用选项 A,这基本上意味着在您的 OSGi 容器的配置文件中设置 OSGi 指定的属性(不特定于任何实现!):

    org.osgi.framework.system.packages.extra=javafx.application;version=0.0.0 ...

    您可以在我创建的这个 Gist 中看到该属性的全部价值:

    https://gist.github.com/renatoathaydes/5021107

    我基本上将它设置为 JavaFX 2.2 jar 可以导出的所有包(我通过简单地将 JavaFX jar 放入我的 Apache Karaf 的部署文件夹中发现了这一点,它会自动将其打包成一个包,然后查看生成的 Manifest)...在尝试的 JavaFX 包中不可见,更不用说 JavaFX 尝试访问的所有 JRE 包)。

    我怀疑并不是我添加的所有包都是真正需要的,但为了安全起见,我将它们全部保留为由 Karaf 的包装器生成的,并且由于它有效,除非有充分的理由,否则我不会更改它。

    现在,只要 JRE lib 文件夹中存在 jfxrt.jar,我的任何包都可以使用 JavaFX。

    【讨论】:

    • 版本被声明为 0.0.0 因为来自外部 OSGi 的包没有版本化,所以你只需给它一个“空”版本号。
    猜你喜欢
    • 2013-11-28
    • 2017-06-18
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多