web-dev-qa-db-ja.com

JavaFX2.1を使用したコンパイルと実行

別のstackoverflowページ( ここ )から取得したコードの単純なセットを使用して、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」が含まれています。

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

12
user1418094

この質問は多少重複しています javafx 2.0を手動でコンパイルしてください

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

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

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

jdk7u6の初期のバイナリビルド へのリンクは次のとおりです。

Windows上のJavaFX2.1の場合、コンパイル用のクラスパスにjfxrt.jar libを含める必要があります(JavaFXプラットフォーム設定を使用する場合はNetBeansが自動的にこれを行います)および(javafxpackagerまたはJavaFXを使用してアプリを正しくパッケージ化していない場合) antタスク)、実行時も。

Linux用のJavaFX2.1はプレリリースです(これを使用している場合)。 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またはjavafxantタスクを使用してコードをパッケージ化することにも注意してください。これらのタスクは、パッケージ化されたアプリにランチャークラスを埋め込み、JavaFXランタイムのバージョンと場所を検出するため、プラットフォームのデフォルトの場所を上書きする場合を除いて、jfxrt.jarの場所を指定する必要はありません。

9
jewelsea