Использование JavaFX 2.2 в связке OSGi

Как я могу использовать JavaFX 2.2 в связке OSGi? Я использую Apache Felix, так что это не проект eclispe. Он должен работать на Mac OSX с установленной Java7 (Java6 будет круто, но не обязательно).

Я читал что-то о переупаковке библиотек jfx, но для проектов плагинов eclispe.

Простой импорт пакетов javafx в пакет Manifest создал отсутствующее требование osgi.wiring.package Exception.


person Christof Aenderl    schedule 05.11.2012    source источник


Ответы (3)


Попробуйте использовать инструменты среды выполнения e(fx)clipse, которые включают библиотеки, позволяющие JavaFX хорошо работать в среде OSGi.

Согласно сайту e(fx)clipse:

К сожалению, JavaFX написан без учета OSGi, поэтому существуют различные места, которые вызывают проблемы при работе внутри OSGi, начиная от того факта, что исполняемые файлы JavaFX расположены где-то в системе пользователя, до проблем, когда дело доходит до загрузки классов из-за правил видимости OSGi. . e(fx)clipse предоставляет вспомогательные библиотеки для решения всех этих проблем и делает написание приложений JavaFX поверх Eclipse Equinox таким же простым, как с SWT и Swing.

person jewelsea    schedule 05.11.2012
comment
Но я не использую SWT и равноденствие затмения. Нет ли более общего способа создания таких вспомогательных библиотек OSGi? - person Christof Aenderl; 06.11.2012
comment
Советую задавать вопросы на форуме e(fx)clipse - person jewelsea; 06.11.2012
comment
JavaFX в пакете OSGi по-прежнему немного сложен. Плагин e(fx)clipse работает с равноденствием, но я не смог заставить его работать с apache Felix, поэтому мне пришлось добавить классы javafx в boot-classloader, а не в osgi-bundle. Надеюсь, что дальнейшие версии FX улучшатся здесь. - person Christof Aenderl; 29.11.2012

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

Дело в том, что вам нужно разрешить JavaFX загружать и использовать любой класс, который он хочет (JavaFX использует внутренности JRE, что делает его очень сложным для сборки), поэтому вам действительно нужно предоставить ему доступ к OSGi. повышение пути к классам...

Я не эксперт, но в этом блоге Костин Лео из SpringSource объясняет, как это сделать (для любых jar-файлов, предполагающих полный доступ к системному загрузчику классов, а не только к JavaFX) тремя разными способами:

http://blog.springsource.org/2009/01/19/exposed-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

В основном я установил его со всеми пакетами, которые может экспортировать jar JavaFX 2.2 (и я обнаружил это, просто поместив jar JavaFX в папку развертывания моего Apache Karaf, которая автоматически превращает его в пакет, а затем просмотрев сгенерированный манифест)... кстати, я пытался использовать пакет, сгенерированный Karaf (который использует для этого pax-wrap), но это не сработает из-за того, как JavaFX пытается загрузить ваши классы (которые не видны в предпринятом пакете JavaFX, не говоря уже обо всех пакетах JRE, к которым пытается получить доступ JavaFX).

Я подозреваю, что не все пакеты, которые я добавил, на самом деле необходимы, но на всякий случай я оставил их все сгенерированными оболочкой Karaf, и поскольку это работает, я не буду это менять, если для этого нет веской причины.

Теперь любой из моих пакетов может использовать JavaFX, если файл jfxrt.jar присутствует в папке JRE lib.

person Renato    schedule 17.02.2013
comment
Версия объявлена ​​как 0.0.0, потому что пакеты, поступающие из-за пределов OSGi, не имеют версии, поэтому вы просто даете ей «пустой» номер версии. - person Renato; 18.02.2013

Будет работать не пакет с 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 установлен на клиентском компьютере).

person Christof Aenderl    schedule 13.11.2012
comment
Это хороший подход. Можно ли это сделать, только изменив конфигурацию контейнеров OSGI и не требуя дополнительного кода? - person Mike Pone; 01.04.2014
comment
Может ли кто-нибудь с Apache Karaf попробовать изменить файл jre.properties в своем каталоге /etc? - person Mike Pone; 01.04.2014