2012-11-05 58 views
7

如何在OSGi包中使用JavaFX 2.2?我使用的是Apache Felix,因此它不是eclispe項目。它必須在裝有Java7的Mac OSX上運行(Java6會很酷,但不是必需的)。在OSGi包中使用JavaFX 2.2

我讀過一些關於重新包裝jfx庫但是用於eclispe插件項目的內容。

只要在bundle中導入javafx包Manifest創建了一個缺少的需求osgi.wiring.package異常。

回答

7

嘗試使用e(fx)clipse運行時工具,其中包括允許JavaFX在OSGi環境中良好運行的庫。

按照e(fx)clipse site

不幸的是JavaFX是不使用OSGi寫在心中,以便有其內部的OSGi運行,從事實JavaFX的二進制文件的地方位於用戶時造成的問題不同的地方系統,因爲OSGi的可見性規則而導致類加載的問題。 E(FX)clipse提供幫助庫來處理所有這些問題,使得編寫JavaFX應用程序ontop的Eclipse之後的感覺一樣簡單,因爲它是用SWT和Swing

+1

但我沒有使用SWT和日食春分。沒有更通用的創建這種OSGi幫助程序庫的方法嗎? – chrise

+1

我建議在[e(fx)clipse論壇](https://groups.google.com/forum/m/?fromgroups#!forum/efxclipse)上提問你的問題 – jewelsea

+1

OSGi Bundle中的JavaFX仍然有點棘手。 e(fx)clipse插件與equinox一起工作,但我沒有得到它與Apache Felix的工作,所以我不得不將javafx類添加到boot-classloader而不是osgi-bundle。希望進一步的FX版本將在這裏得到改善 – chrise

6

不使用JavaFX捆綁,但增加了JavaFX類到啓動類加載器將工作。 實施例用Apache菲利克斯:

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)。

+0

這是一個很好的方法。這可以通過只需要修改OSGI容器配置而不需要額外的代碼來完成嗎? –

+0

有人可以用Apache Karaf嘗試修改其/ etc目錄中的jre.properties文件嗎? –

11

這是一個有點晚來幫助你,也許,但我想記錄一個簡單的方法來實現的JavaFX的情況下,任何人在OSGi環境,像我這樣,仍然有麻煩做....

問題是,您需要允許JavaFX加載和使用它想要的任何類的可能性(JavaFX利用JRE的內部組件,這使得它很難捆綁),所以您真正想要的是讓它訪問OSGi在這個博客中,來自SpringSource的Costin Leau解釋瞭如何做到這一點(對於假設完全訪問系統類加載器的任何jar,不僅僅是JavaFX)在3中不同的方式:

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

我選擇使用選項A,這基本上意味着在你的OSGi容器的配置文件設置OSGi的指定屬性(不針對任何執行!):

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

你可以看到在這個要點物業的整體價值我已經CREA特德:

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

我基本上所有的軟件包,其中的JavaFX 2.2罐子可以導出設置(我發現了這一點,通過簡單地丟棄了JavaFX的jar文件放進我的Apache Karaf,的部署文件夾,其自動地使它成爲一個捆綁包,然後查看生成的Manifest)...順便說一句,我嘗試使用由Karaf生成的包(使用pax-wrap來完成),但由於JavaFX試圖加載您的類的方式(這在嘗試的JavaFX包中不可見,更不用說JavaFX試圖訪問的所有JRE包)。

我懷疑並非所有我添加的軟件包實際上都是必需的,但爲了安全起見,我把它們全部保存爲由Karaf的包裝生成的,並且在工作時,除非有充分的理由,否則我不會改變。

現在我的任何bundle都可以使用JavaFX,只要jfxrt.jar存在於JRE lib文件夾中即可。

+0

版本被聲明爲0.0.0,因爲來自OSGi外部的軟件包沒有版本控制,因此您只需給它一個'空'版本號即可。 – Renato