2015-02-26 7 views
3

Я разрабатываю богатое приложение на основе JavaFX и контейнера OSGi Felix. Когда началась моя JavaFX, org.osgi.framework.BundleException брошен, указывающим, что framwork не мог телеграфировать мои JavaFX пакетов:Неразрешенные пакеты JavaFX в приложении OSGi Felix

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 

А вот аргументы VM, используемые для запуска OSGi Framework (я запустить свой проект под Затмения Луны, используя this plugin):

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

Последний аргумент не влияет. Несмотря на это this article, которые говорят, что он работает на Равноденствие ...

Я нашел решение, добавив эту опцию к аргументам VM:

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

Но это не очень гибким.


Считаете ли вы, что реализация Felix OSGi является проблемой? Должен ли он работать только с Equinox? Кто-нибудь может мне помочь? Правильно ли это?

+1

Хотя я не знаю об OSGi, мне любопытно узнать, почему 'javafx.stage; version =" 2.2.0 "'? – ItachiUchiha

+0

Возможно, в [e (fx) клипсе есть что-то] (http://www.eclipse.org/efxclipse/index.html#about-tooling): «К сожалению, JavaFX не был написан с OSGi, поэтому есть различные Источники ошибок при запуске внутри OSGi. Эти проблемы включают расположение двоичных файлов JavaFX в ваших установках Java и загрузке классов из-за правил видимости OSGi. e (fx) clipse предоставляет вспомогательные библиотеки для решения всех этих проблем и делает запись JavaFX приложения на вершине Eclipse Equinox чувствуют себя так же легко, как и SWT и Swing ». Я ничего не знаю о OSGi; просто цитируя документ. – jewelsea

+0

@jewelsea Хорошо, но поскольку JDK8 JavaFX загружается в ExtClassloader, поэтому он должен теоретически работать :( –

ответ

0

Я выпустил версию раннего доступа Drombler FX, новую платформу Rich Client для JavaFX на основе OSGi (Apache Felix) и Maven.

В качестве рамок приложения он гарантирует, что JavaFX и OSGi будут запущены должным образом и обеспечит главное окно.

Вы можете прочитать больше о Drombler FX здесь: http://puces-blog.blogspot.ch/search/label/Drombler

Там есть Getting Started страница, которая объясняет, как создать, построить и запустить пример приложения Drombler FX с помощью нескольких простых шагов.

Обратите внимание, что в настоящее время a critical bug в Docking Framework из-за a bug in JavaFX. Однако эта ошибка должна быть исправлена ​​в версии Java SE/JavaFX 8u40 (expected release date: март 2015 г.).

5

Спецификация OSGi требует, чтобы пакеты должны импортировать все пакеты, которые не начинаются с «java.». Поэтому вам нужно импортировать пакеты, начинающиеся с «javax». Итак, теперь вам нужен экспортер и источник для пакетов. -Dorg.osgi.framework.bundle.parent=ext дает вам источник для пакетов, поскольку загрузчик ext classloader входит в родительский пакет. Но разработчику инфраструктуры еще нужно иметь экспортера для пакета, чтобы знать, что импорт пакета правильно разрешен. Вот почему вам нужно -Dorg.osgi.framework.system.packages.extra=javafx.stage.

+0

Но мне не нужно делать это для пакетов, начинающихся с _org. * (org.w3c.com, org.xml.sax) _. Это происходит только с javafx. * packages –

+1

_You_ тоже нет, потому что framework impl установил 'org.osgi.framework.system.packages' набор пакеты, обычно встречающиеся в JRE. JavaFX не находится в нормальном наборе пакетов, найденном в JRE (поэтому вам нужно использовать ext classloader.) См. https://svn.apache.org/repos/asf/felix/ ствол/рамки/SRC/основные/ресурсы/default.properties. –

Смежные вопросы