OSGi Felix应用程序中未解析的JavaFX包

thi*_*ult 4 eclipse osgi javafx maven apache-felix

我开发了一个基于JavaFX和OSGi Felix容器的丰富应用程序.当我的JavaFX是开始,一个org.osgi.framework.BundleException被抛出,表明framwork无法电线我的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)))
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

这里用于启动OSGi框架的VM Arguments(我使用此插件在Eclipse Luna下运行我的项目):

-Dosgi.requiredJavaVersion=1.8 -Dorg.osgi.framework.bundle.parent=ext
Run Code Online (Sandbox Code Playgroud)

最后一个参数无效.尽管如此,这篇文章告诉它它可以在Equinox上运行......

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

-Dorg.osgi.framework.system.packages.extra=javafx.stage
Run Code Online (Sandbox Code Playgroud)

但这不是很灵活.


您认为Felix OSGi的实现是否存在问题?它应该只与Equinox一起使用吗?有人可以帮帮我吗?这是正确的方法吗?

BJ *_*ave 6

OSGi规范要求bundle必须导入所有不以"java."开头的包.所以你需要导入以"javax"开头的包.所以现在你需要一个导出器和包的源.-Dorg.osgi.framework.bundle.parent=ext为你提供了包的源代码,因为ext classloader loader包含在bundle parent中.但是框架解析器仍然需要有一个包的导出器才能知道bundle的导入是否已正确解析.这就是你需要的原因-Dorg.osgi.framework.system.packages.extra=javafx.stage.