【问题标题】:Compiling and running with JavaFX 2.1使用 JavaFX 2.1 编译和运行
【发布时间】:2012-06-08 22:38:00
【问题描述】:

我正在尝试使用从另一个 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”。

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

【问题讨论】:

  • 我认为您的设置有问题。不必将任何 JavaFX jar 手动放在类路径中。您是如何构建和运行 JavaFX 应用程序的?使用 NetBeans 提供的 ant 脚本?
  • 不,我没有使用 NetBeans,而是直接从控制台工作。我的 javac 行是:'javac -classpath "c:\Program Files\Oracle\JavaFX 2.1 SDK\rt\lib\jfxrt.jar";..\bin -d ..\bin ..\src\progtext.java'

标签: java runtime mp3 javafx noclassdeffounderror


【解决方案1】:

这个问题与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 包含在类路径中。

这里是一个在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 位置,除非您想覆盖平台的默认位置。

【讨论】:

  • 非常感谢珠宝海。这很有帮助。在我尝试安装 jdk7u6 之前,我想看看需要什么才能让我的代码与我已经拥有的 jdk7u4 一起运行。我如何让我的程序像现在一样运行?你有什么想法吗?
  • 小修正:即使对于 Linux 的 JavaFX 2.1 预发行版,如果设置正确,类路径中也不需要 jfxrt.jar。
  • 谢谢 Puce,我更新了答案以包含您的更正。
  • 资源idea的外部表单查找来自JavaFX deployment guide, section 4.3.1
  • 我创建了javafx-jira.kenai.com/browse/RT-22071 "new Media(source) 应该找到类似于 new Image(url)" 的相关资源,以便您的 new Media("msg.mp3") 请求可以按预期工作.
【解决方案2】:

对于 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

【讨论】:

  • -1 你在回复什么?你没有提到 Q 中的问题。
猜你喜欢
  • 2020-09-09
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2012-03-15
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多