2012-11-05 20 views
7

Jak mogę używać JavaFX 2.2 w pakiecie OSGi? Używam Apache Felix, więc nie jest to projekt typu eclispe. Musi działać na Mac OSX z zainstalowaną Javą7 (Java6 byłaby fajna, ale nie konieczna).Korzystanie z JavaFX 2.2 w pakiecie OSGi

Czytałem coś o przepakowywaniu bibliotek jfx, ale dla projektów wtyczek eclispe.

Po prostu zaimportowanie pakietów javafx w pakiecie Manifest utworzył brakujące wymaganie osgi.wiring.package Wyjątek.

Odpowiedz

7

Spróbuj użyć narzędzi uruchomieniowych e (fx) clipse, które zawierają biblioteki, aby środowisko JavaFX działało dobrze w środowisku OSGi.

Według e(fx)clipse site:

Niestety JavaFX nie jest napisane z OSGi pamiętać więc istnieje wiele miejsc, które są przyczyną problemów podczas uruchamiania wewnątrz OSGi począwszy od faktu JavaFX-Binaries znajdują się gdzieś na użytkowników system, do problemów związanych z ładowaniem klas z powodu zasad widoczności OSGi. e (fx) Clipse zapewnia bibliotek pomocniczych do czynienia z tymi wszystkimi problemami i ułatwia pisanie aplikacji JavaFX ontop Eclipse Equinox czuć się tak łatwe, jak to jest z SWT i Swing

+1

Ale ja nie używam SWT i eclipse równonocy. Czy nie istnieje bardziej ogólny sposób tworzenia takich bibliotek pomocniczych OSGi? – chrise

+1

Radzę zadawać pytania na forum [e (fx) clipse] (https://groups.google.com/forum/m/?fromgroups#!forum/efxclipse) – jewelsea

+1

JavaFX w pakiecie OSGi jest wciąż trochę skomplikowana . Wtyczka e (fx) clipse pracuje z equinoxem, ale nie udało mi się go uruchomić z apache Felix, więc musiałem dodać klasy javafx do boot-classloader, a nie do pakietu osgi. Mam nadzieję, że kolejne wersje FX poprawią się tutaj. – chrise

6

a nie wiązki z JavaFX ale dodanie klas JavaFX do bootloader-klasy będzie działać. Przykład z 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(); 

Teraz wystarczy użyć klas JavaFX z każdej wiązki (jeśli JavaFX jest zainstalowany na komputerze klienckim).

+0

To jest dobre podejście. Czy można tego dokonać, zmieniając tylko konfigurację kontenerów OSGI i nie wymagając dodatkowego kodu? –

+0

Czy ktoś z Apache Karaf może zmodyfikować plik jre.properties w swoim katalogu/etc? –

11

To trochę późno, aby ci pomóc, prawdopodobnie, ale chciałbym, aby udokumentować prosty sposób, aby umożliwić JavaFX wewnątrz środowisku OSGi w przypadku innych, jak ja, wciąż miał problemy robi to ....

Chodzi o to, że musisz umożliwić JavaFX załadowanie i użycie dowolnej klasy, jakiej chce (JavaFX korzysta z wewnętrznych elementów JRE, co sprawia, że ​​naprawdę trudno jest je połączyć), więc to, czego naprawdę chcesz, to dać mu dostęp do OSGi boostraping classpath ...

Nie jestem ekspertem, ale na tym blogu Costin Leau ze SpringSource wyjaśnia, jak to zrobić (dla wszystkich słoików, które zakładają pełny dostęp do systemu klasyloader, nie tylko JavaFX) w 3 różne sposoby:

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

wybrałem użyć opcji A, która w zasadzie oznacza ustawienie OSGi-określonej nieruchomości (nie specyficzne dla każdej realizacji!) W pliku konfiguracyjnym Twojego kontenera OSGi:

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

można zobaczyć całą wartość nieruchomości, w tym Gist mam Crea ted:

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

I w zasadzie ustawić je wszystkie pakiety, które można wyeksportować JavaFX 2.2 słoik (a ja się o tym po prostu spada słoik JavaFX do folderu deploy mojego Apache Karaf, który automagicznie tworzy pakiet, a następnie przegląda wygenerowany Manifest) ...przy okazji, próbowałem użyć pakietu wygenerowanego przez Karaf (który używa pax-wrap), ale to nie zadziała ze względu na sposób, w jaki JavaFX próbuje załadować twoje klasy (które nie są widoczne w próbowanym pakiecie JavaFX, nie wspominając o wszystkich pakietach JRE JavaFX próbuje uzyskać dostęp).

Podejrzewam, że nie wszystkie z dodanych pakietów są rzeczywiście wymagane, ale żeby być bezpiecznym, zostawiłem je wszystkie jako wygenerowane przez opakowanie Karaf i jak to działa, nie zmienię tego, chyba że jest ku temu dobry powód.

Teraz każdy z moich pakietów może korzystać z JavaFX, o ile plik jfxrt.jar jest obecny w folderze JRE lib.

+0

Wersja jest zadeklarowana jako 0.0.0, ponieważ pakiety pochodzące spoza OSGi nie są wersjonowane, więc po prostu nadajesz jej "pusty" numer wersji. – Renato