12

別のstackoverflowページ( here )から取得した単純なコード行のセットを使用して、JavaFXの非常に単純な使用を試みています。しかし、問題は明らかにそのコードではなく、ビルドおよび実行プロセスのより基本的なものにあります。

これが私のコードです:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
.
.
.
Media medMsg = new Media("msg.mp3");
MediaPlayer medplMsg = new MediaPlayer(medMsg);
medplMsg.play();

最初は、これをまったくコンパイルできませんでした。最終的に、 javac コマンドラインに -classpath c:\Program Files\Oracle\JavaFX 2.1 SDK\lib\rt\jfxrt.jar を配置する必要があることがわかりました。(ここでの明らかな複雑な質問の 1 つは、(1) これが必要であり、(2) JavaFX インストールへのパスが何であるかを正確に把握する方法が明確な場所に文書化されていないのはなぜですか?!)

しかし、コードを実行すると、次のようになります。

Exception in thread "main" java.lang.NoClassDefFoundError: javafx/scene/media/Media

    at progtest.main(progtest.java:120)
Caused by: java.lang.ClassNotFoundException: javafx.scene.media.Media
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

これは何を意味するのでしょうか?実行時に javafx.scene.media.Media クラスを見つける方法がわからないようです。しかし、私の %CLASSPATH% 変数には間違いなく "c:\Program Files\Oracle\JavaFX 2.1 SDK\lib\rt\jfxrt.jar" が含まれています。

何か案は?前もって感謝します!

4

2 に答える 2

9

この質問は、javafx 2.0 を手動でコンパイルすることと多少重複しています。

この回答は、特に Oracle Java 8 のリリース前の JavaFX 2 バージョン向けです。Oracle JavaFX 8+ の場合、JavaFX ランタイムはクラスパス上にあるため、アプリケーションのコンパイル時または JavaFX 実行時に明示的に追加する必要はありません。

Java には、jdk7u6 以降 (Windows および Linux 用) および jdk7u4 以降 (OSX 用) の JavaFX が含まれています。

jdk7u6+ をダウンロードして使用すると、任意のクラスパスで jfxrt.jar ファイルを指定する必要がなくなり、JavaFX 関連のクラスパスの問題はすべて解消されます。

これは、 jdk7u6の初期のバイナリ ビルドへのリンクです。

Windows 上の JavaFX 2.1 の場合、コンパイルのためにクラスパスに jfxrt.jar lib を含める必要があります (NetBeans の JavaFX プラットフォーム設定を使用すると、NetBeans はこれを自動的に行います)。 Ant タスク)、実行時も同様です。

JavaFX 2.1 for Linux はプレリリースです (それを使用している場合)。Linux プレリリースでは、Linux 上の JavaFX ランタイムが正しく設定されていない場合、コンパイル時と実行時の両方でクラスパスに jfxrt.jar を含めるだけで済みます。

Windows での JavaFX プログラムのコマンド ライン コンパイルと実行の例を次に示します。

エディターを起動します。

C:\dev\test>notepad HelloWorld.java

次のコードを貼り付けて保存します。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;

public class HelloWorld extends Application {
  public static void main(String[] args) {
    launch(args);
  }
  @Override
  public void start(Stage stage) {
    stage.setScene(new Scene(new Label("Hello World")));
    stage.show();
  }
}

JavaFX 2.2をコンパイルして実行します。

C:\dev\test>javac -cp "\Program Files\Oracle\JavaFX 2.2 Runtime\lib\jfxrt.jar" HelloWorld.java
C:\dev\test>java -cp ".;\Program Files\Oracle\JavaFX 2.2 Runtime\lib\jfxrt.jar" HelloWorld

Oracle Java 8+ の場合、明示的な JavaFX クラスパス指定子は必要ありません。

C:\dev\test>javac HelloWorld.java
C:\dev\test>java HelloWorld

通常、コードをコンパイルして実行するだけでなく、javafxpackager または javafx ant タスクを使用してコードをパッケージ化することにも注意してください。これらのタスクは、JavaFX ランタイムのバージョンと場所を検出するランチャー クラスをパッケージ化されたアプリに埋め込みます。そのため、プラットフォームのデフォルトの場所をオーバーライドする場合を除き、jfxrt.jar の場所を指定する必要はありません。

于 2012-06-04T21:38:52.780 に答える