java - 使用 JavaFX 2.1 编译运行

标签 java runtime mp3 javafx noclassdeffounderror

我正在尝试使用一组简单的代码行来非常简单地使用 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();

起初我根本无法编译它。最终我发现我需要将 -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”。

有什么想法吗?提前致谢!

最佳答案

这个问题有点重复 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 库以进行编译(如果您使用它的 JavaFX 平台设置,NetBeans 会自动执行此操作)和(如果您没有使用javafxpackager 或 JavaFX ant 任务),也在运行时。

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

下面是一个JavaFX程序在windows下的命令行编译和执行的例子。

启动编辑器:

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 位置,除非您想覆盖平台的默认位置。

关于java - 使用 JavaFX 2.1 编译运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888367/

相关文章:

ios - AVAudioPlayer 没有快速播放音频

java - 检查 RDD 的相等性

java - 如何为 java 注释处理器编写自动化单元测试?

java - 禁用用户主文件夹创建

python - 如果我将通常调用的代码放入单独的方法或文件中,Python 会更快吗?

javascript - 'PHP' 的运行时环境是什么以及在哪里,就像 'Node.js' 的 'Javascript' 运行时环境一样,用于构建服务器端 Web 应用程序?

java - Java中编译C的时间间隔定义

mp3 - 如何在不下载的情况下确定 .mp3 比特率?

mp3 - 使用 html5 的 audo 标签下载时是否可以播放音频(mp3)

java - 确保通用 lambda 表达式的类型安全