我正在尝试使用一组简单的代码行来简单地使用JavaFX,这些代码行是从另一个stackoverflow页面(here)获得的。但是,问题显然不在于代码,而是在构建和运行过程中有更基本的东西。
这是我的代码:
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)记录这是否需要;(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”。
有什么想法吗?提前谢谢!
答案 0 :(得分:9)
这个问题有点重复compile javafx 2.0 manually。
此答案专门针对Oracle Java 8发布之前的JavaFX 2版本。对于Oracle JavaFX 8+,JavaFX运行时位于类路径上,因此在编译或JavaFX时无需显式添加它运行应用程序。
Java包括jdk7u6及更高版本(适用于Windows和Linux)和jdk7u4及更高版本(适用于OSX)中的JavaFX。
下载并使用jdk7u6 +,您无需在任何类路径中指定jfxrt.jar文件,所有与JavaFX相关的类路径问题都应该消失。
以下是指向early binary build of jdk7u6的链接。
对于Windows上的JavaFX 2.1,您需要在类路径中包含jfxrt.jar lib以进行编译(如果您使用它的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位置,除非您想覆盖平台的默认位置。
答案 1 :(得分:-4)
对于Java 7更新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