7

OSGi バンドルで JavaFX 2.2 を使用するにはどうすればよいですか? 私は Apache Felix を使用しているので、Eclipse プロジェクトではありません。Java7 がインストールされた Mac OSX で実行する必要があります (Java6 はクールですが、必須ではありません)。

jfxライブラリの再パックについて何か読んだことがありますが、eclispeプラグインプロジェクト用です。

バンドル マニフェストに javafx パッケージをインポートするだけで、不足している要件 osgi.wiring.package Exception が作成されました。

4

3 に答える 3

11

おそらく、あなたを助けるには少し遅れていますが、私のような誰かがまだそれを行うのに問題がある場合に備えて、OSGi 環境内で JavaFX を有効にする簡単な方法を文書化したいと思います....

問題は、JavaFX が必要なクラスをロードして使用できるようにする必要があることです (JavaFX は JRE の内部構造を使用するため、バンドルが非常に困難になります)。クラスパスをブーストラップ中...

私は専門家ではありませんが、このブログでは、SpringSource の Costin Leau が (JavaFX だけでなく、システム クラスローダーへのフル アクセスを前提とするすべての jar に対して) 3 つの異なる方法でそれを行う方法を説明しています。

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

私は基本的に、JavaFX 2.2 jar がエクスポートできるすべてのパッケージを設定しました (そして、JavaFX jar を Apache Karaf の deploy フォルダーにドロップするだけでこれを見つけました。これにより、自動的にバンドルが作成され、次に生成されたマニフェスト)...ちなみに、Karafによって生成されたバンドル(pax-wrapを使用して実行します)を使用しようとしましたが、JavaFXがクラスをロードしようとする方法が原因で機能しません(表示されません)試行された JavaFX バンドルでは、JavaFX がアクセスしようとするすべての JRE パッケージは言うまでもありません)。

追加したパッケージのすべてが実際に必要なわけではないと思いますが、安全のために、Karaf のラッパーによって生成されたものをすべて残しました。動作するので、正当な理由がない限り変更しません。

jfxrt.jar が JRE lib フォルダーに存在する限り、どのバンドルでも JavaFX を使用できるようになりました。

于 2013-02-17T21:39:57.973 に答える
7

e(fx)clipse ランタイム ツールを使用してみてください。これには、OSGi 環境で JavaFX を適切に動作させるためのライブラリが含まれています。

e(fx)clipse サイトによると:

残念ながら、JavaFX は OSGi を念頭に置いて作成されていないため、OSGi 内で実行すると、JavaFX-Binaries がユーザー システムのどこかにあるという事実から、OSGi の可視性ルールによるクラスのロードに関する問題まで、さまざまな場所で問題が発生します。 . e(fx)clipse は、これらすべての問題に対処するためのヘルパー ライブラリを提供し、SWT や Swing と同じくらい簡単に Eclipse Equinox の上に JavaFX アプリケーションを作成できるようにします。

于 2012-11-05T23:28:11.857 に答える
6

JavaFX とのバンドルではありませんが、javafx クラスを boot-classloader に追加すると機能します。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 がクライアント コンピューターにインストールされている場合)。

于 2012-11-13T14:58:09.510 に答える