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();

起初我根本无法编译它。最终我发现我需要将 -classpath c:\Program Files\Oracle\JavaFX 2.1 SDK\lib\rt\jfxrt.jar 放在我的 javac 命令行上。(这里一个明显的复杂问题是:为什么没有在任何明显的地方记录它(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

这个问题有些重复compile javafx 2.0 manual

此答案专门针对 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 库以进行编译(如果您使用它的 JavaFX 平台设置,NetBeans 会自动执行此操作)和(如果您没有使用 javafxpackager 或 JavaFX 正确打包您的应用程序ant 任务),也在运行时。

适用于 Linux 的 JavaFX 2.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 或 javafx ant 任务打包代码。这些任务将在打包的应用程序中嵌入一个启动器类,该类将检测 JavaFX 运行时的版本和位置,因此您无需指定 jfxrt.jar 位置,除非您想覆盖平台的默认位置。

于 2012-06-04T21:38:52.780 回答
-4

对于 Java 7 update 21,Windows XP SP3,我使用

javac -cp "\Program Files\Java\jre7\lib\jfxrt.jar"   HelloWorld.java

java -cp ".;\Program Files\Java\jre7\lib\jfxrt.jar"   HelloWorld
于 2013-04-18T19:34:04.017 回答