2012-11-05 22 views
7

Come è possibile utilizzare JavaFX 2.2 in un bundle OSGi? Sto usando Apache Felix quindi non è un progetto eclispe. Deve essere eseguito su Mac OSX con Java7 installato (Java6 sarebbe bello ma non necessario).Utilizzo di JavaFX 2.2 nel bundle OSGi

Ho letto qualcosa sul reimballaggio delle librerie jfx ma per i progetti di plugin eclispe.

Solo importazione dei pacchetti javafx nel pacchetto Manifest ha creato un requisito mancante osgi.wiring.package Eccezione.

risposta

7

Provare a utilizzare gli strumenti di runtime clipse e (fx), che includono le librerie per consentire a JavaFX di funzionare correttamente in un ambiente OSGi.

Secondo il e(fx)clipse site:

Purtroppo JavaFX non è scritto con OSGi in mente in modo ci sono vari luoghi che stanno causando problemi durante l'esecuzione all'interno OSGi che vanno dal fatto JavaFX-binari si trovano da qualche parte sugli utenti sistema, a problemi quando si tratta di caricare le classi a causa delle regole di visibilità di OSGi. e (fx) Clipse fornisce le librerie di supporto per affrontare tutti questi problemi e rende la scrittura di applicazioni JavaFX ontop di Eclipse Equinox una sensazione così facile come è con SWT e Swing

+1

Ma non sto usando l'equinozio SWT ed eclipse. Non c'è un modo più generico di creare librerie di helper OSGi? – chrise

+1

Ti consiglio di porre le tue domande sul [e (fx) clipse forum] (https://groups.google.com/forum/m/?fromgroups#!forum/efxclipse) – jewelsea

+1

JavaFX in un pacchetto OSGi è ancora un po 'complicato . Il plug-in e (fx) clipse funziona con l'equinozio, ma non l'ho fatto funzionare con Apache Felix, quindi ho dovuto aggiungere le classi javafx al boot-classloader non all'osgi-bundle. Spero che ulteriori versioni FX miglioreranno qui. – chrise

6

Non un bundle con JavaFX, ma aggiungendo le classi JavaFX al boot-classloader funzionerebbe. Esempio con 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(); 

Ora basta utilizzare le classi JavaFX da ogni fascio (se JavaFX è installato sul computer client).

+0

Questo è un buon approccio. Questo può essere fatto solo modificando la configurazione dei contenitori OSGI e non avendo bisogno di codice aggiuntivo? –

+0

Qualcuno con Apache Karaf può provare a modificare il file jre.properties nella propria directory/etc? –

11

E 'un po' tardi per aiutare voi, probabilmente, ma vorrei documentare un modo semplice per consentire JavaFX all'interno di un ambiente OSGi nel caso in cui qualcuno, come me, ancora avuto problemi a farlo ....

Il fatto è che devi consentire a JavaFX di caricare e utilizzare qualsiasi classe desiderata (JavaFX utilizza internals di JRE che lo rende davvero difficile da raggruppare), quindi quello che vuoi veramente è dargli accesso a OSGi boaseping classpath ...

Non sono esperto, ma in questo blog, Costin Leau, di SpringSource, spiega come farlo (per ogni jar che presuppone l'accesso completo al classloader di sistema, non solo JavaFX) in 3 diversi modi:

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

ho scelto di usare l'opzione A, che in pratica significa impostando la proprietà OSGi-specificato (non specifiche per qualsiasi implementazione!) Nel file di configurazione del vostro contenitore OSGi:

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

È possibile visualizzare l'intero valore della proprietà in questo Gist ho crea Ted:

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

Io fondamentalmente impostato con tutti i pacchetti che il vaso JavaFX 2.2 in grado di esportare (e ho trovato questo fuori semplicemente lasciando cadere il vaso JavaFX nella cartella deploy del mio Apache Karaf, che automagicamente lo trasforma in un pacchetto e poi guarda il Manifesto generato) ...a proposito, ho provato ad usare il bundle generato da Karaf (che usa pax-wrap per farlo) ma questo non funzionerà a causa del modo in cui JavaFX prova a caricare le tue classi (che non sono visibili nel pacchetto JavaFX tentato, per non parlare di tutti i pacchetti JRE che JavaFX prova ad accedere).

Sospetto che non tutti i pacchetti che ho aggiunto siano effettivamente necessari, ma per essere al sicuro, li ho lasciati tutti come generato dal wrapper di Karaf e, visto che funziona, non lo cambierò a meno che non ci sia una buona ragione per farlo.

Ora uno qualsiasi dei miei pacchetti può utilizzare JavaFX fino a quando jfxrt.jar è presente nella cartella lib di JRE.

+0

La versione è dichiarata come 0.0.0 perché i pacchetti provenienti da OSGi esterni non sono versionati, quindi basta dare un numero di versione 'vuoto'. – Renato