2012-11-05 6 views
7

Wie kann ich JavaFX 2.2 in einem OSGi-Bundle verwenden? Ich benutze Apache Felix, also ist es kein eclispe Projekt. Es muss auf Mac OSX mit Java7 installiert sein (Java6 wäre cool, aber nicht notwendig).Verwenden von JavaFX 2.2 im OSGi-Bundle

Ich habe etwas über das Repacking der JFX-Bibliotheken, aber für Eclispe-Plugin-Projekte gelesen.

Nur die Pakete javafx im Paket importieren Manifest erstellt eine fehlende Anforderung osgi.wiring.package Ausnahme.

Antwort

7

Probieren Sie die e (fx) clipse-Laufzeittools aus, die Bibliotheken enthalten, damit JavaFX in einer OSGi-Umgebung gut funktioniert.

Nach dem e(fx)clipse site:

Leider JavaFX ist nicht mit OSGi im Hinterkopf geschrieben, so gibt es verschiedene Orte gibt, die Probleme verursachen, wenn sie innerhalb OSGi laufen im Bereich von der Tatsache, JavaFX-Binaries irgendwo auf dem Benutzer gespeichert sind System, zu Problemen beim Laden von Klassen aufgrund der Sichtbarkeitsregeln von OSGi. e (fx) clipse bietet Bibliotheken Helfer mit all diesen Problemen zu befassen und JavaFX-Anwendungen ontop von Eclipse Equinox ein Gefühl so einfach macht das Schreiben, wie es mit SWT und

+1

Aber ich benutze SWT und eclipse equinox nicht. Gibt es keine allgemeinere Möglichkeit, solche OSGi-Hilfsbibliotheken zu erstellen? – chrise

+1

Ich rate Ihre Fragen über die [e (fx) clipse Forum] fragen (https://groups.google.com/forum/m/?fromgroups#!forum/efxclipse) – jewelsea

+1

JavaFX in einem OSGi Bundle ist immer noch ein bisschen schwierig . Das e (fx) clipse plugin arbeitet mit der Tagundnachtgleiche, aber ich habe es nicht mit Apache Felix arbeiten lassen, also musste ich die javafx-Klassen zum boot-classloader und nicht zum osgi-bundle hinzufügen. Hoffe, weitere FX-Versionen werden sich hier verbessern. – chrise

6

Nicht ein Bündel mit JavaFX Schwingen aber das Hinzufügen der javafx Klassen zum Boot-Classloader würde funktionieren. Beispiel mit 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(); 

Jetzt nur noch die javafx Klassen von jedem Bündel verwenden (wenn JavaFX auf dem Client-Computer installiert ist).

+0

Dies ist ein guter Ansatz. Können Sie dies tun, indem Sie nur die Konfiguration Ihrer OSGI-Container ändern müssen und keinen zusätzlichen Code benötigen? –

+0

Kann jemand mit Apache Karaf versuchen, die Datei jre.properties in ihrem Verzeichnis/etc zu ändern? –

11

Es ist ein wenig zu spät, Ihnen zu helfen, wahrscheinlich, aber ich möchte eine einfache Art und Weise dokumentieren JavaFX innerhalb einer OSGi-Umgebung, falls jemand zu ermöglichen, wie ich, hatte immer noch Mühe, es zu tun ....

Die Sache ist, dass Sie JavaFX die Möglichkeit geben müssen, jede gewünschte Klasse zu laden und zu benutzen (JavaFX nutzt Interna der JRE, was es wirklich schwer macht, zu bündeln), also wollen Sie ihm wirklich Zugriff auf den OSGi geben boostraping classpath ...

Ich bin kein Experte, aber in diesem Blog, Costin Leau, von SpringSource, erklärt, wie es geht (für alle Jars, die vollständigen Zugriff auf den System-Klassenlader, nicht nur JavaFX) in 3 verschiedene Wege: im Grunde bedeutet, die OSGi-specified-Eigenschaft (! nicht spezifisch für jede Implementierung) in Ihrem OSGi Container Konfigurationsdatei

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

wählte ich Option A zu verwenden, die:

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

Sie können in diesem Gist den gesamten Wert der Immobilie sehen habe ich Crea ted:

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

Ich habe im Grunde ist es mit all den Paketen, die die JavaFX 2.2 jar (und ich fand dies heraus, indem Sie einfach Fallenlassen der JavaFX jar in den deploy Ordner meines Apache Karaf exportieren können, die automagically macht es zu einem Bündel und schaut dann auf das generierte Manifest) ...Übrigens, ich habe versucht, das von Karaf erzeugte Paket zu verwenden (das pax-wrap dazu verwendet), aber das wird nicht funktionieren, weil JavaFX versucht, Ihre Klassen zu laden (die im versuchten JavaFX-Paket nicht sichtbar sind), ganz zu schweigen von allen JRE-Paketen, auf die JavaFX zuzugreifen versucht.

Ich vermute, dass nicht alle Pakete, die ich hinzugefügt habe, tatsächlich benötigt werden, aber um sicher zu sein, habe ich sie alle wie von Karaf Wrapper erzeugt und wie es funktioniert, werde ich das nicht ändern, es sei denn es gibt einen guten Grund dafür.

Nun kann jeder meiner Bundles können JavaFX verwenden, solange die jfxrt.jar im JRE lib Ordner vorhanden ist.

+0

Die Version wird als 0.0.0 deklariert, da Pakete, die von außerhalb von OSGi kommen, nicht versioniert sind. Geben Sie einfach eine "leere" Versionsnummer ein. – Renato

Verwandte Themen