使用JavaFX 2.1编译和运行

12 java mp3 javafx runtime noclassdeffounderror

我正在尝试使用一组简单的代码行来简单地使用JavaFX,这是我从另一个stackoverflow页面(这里)获得的.但是,问题显然不在于代码,而是在构建和运行过程中有更基本的东西.

这是我的代码:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
.
.
.
Media medMsg = new Media("msg.mp3");
MediaPlayer medplMsg = new MediaPlayer(medMsg);
medplMsg.play();
Run Code Online (Sandbox Code Playgroud)

起初我根本无法编译.最终我发现我需要在我的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
Run Code Online (Sandbox Code Playgroud)

这是什么意思?看起来它在运行时不知道如何找到类javafx.scene.media.Media.但是,我的%CLASSPATH%变量肯定有"c:\ Program Files\Oracle\JavaFX 2.1 SDK\lib\rt\_jfxrt.jar".

有任何想法吗?先感谢您!

jew*_*sea 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以进行编译(如果您使用JavaFX平台设置,NetBeans将自动执行此操作)和(如果您尚未使用javafxpackager或JavaFX正确打包应用程序)蚂蚁任务),也在运行时.

适用于Linux的JavaFX 2.1是预发行版(如果您正在使用它).对于Linux预发行版,如果Linux上的JavaFX运行时未正确设置,则只需在编译和运行时的类路径中包含jfxrt.jar.

以下是Windows下命令行编译和JavaFX程序执行的示例.

启动编辑器:

C:\dev\test>notepad HelloWorld.java
Run Code Online (Sandbox Code Playgroud)

粘贴以下代码并保存:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

编译并运行它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
Run Code Online (Sandbox Code Playgroud)

对于Oracle Java 8+,不需要显式JavaFX类路径说明符:

C:\dev\test>javac HelloWorld.java
C:\dev\test>java HelloWorld
Run Code Online (Sandbox Code Playgroud)

请注意,通常不是仅编译代码并运行它,您还可以使用javafxpackager或javafx ant任务打包代码.这些任务将在您的打包应用程序中嵌入一个启动程序类,它将检测JavaFX运行时的版本和位置,这样您就不需要指定jfxrt.jar位置,除非您要覆盖平台的默认位置.