Вопрос по java, noclassdeffounderror, mp3, javafx, runtime – Компиляция и запуск с JavaFX 2.1

12

Я пытаюсь очень просто использовать 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();

Сначала я не мог заставить это скомпилироваться вообще. В конце концов я понял, что мне нужно поместить -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% определенно имеет & quot; c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ lib \ rt \ jfxrt.jar & quot; в этом.

Есть идеи? Заранее спасибо!

Нет, я не использую NetBeans, но работаю напрямую с консоли. Моя строка javac: «javac -classpath» c: \ Program Files \ Oracle \ JavaFX 2.1 SDK \ rt \ lib \ jfxrt.jar & quot ;; .. \ bin -d .. \ bin .. \ src \ progtext. Java & APOS; user1418094
Я думаю, что у вас что-то не так с вашей настройкой. Нет необходимости помещать какие-либо jar-файлы JavaFX вручную в путь к классам. Как вы строите и запускаете приложение JavaFX? С помощью скриптов ant, предоставляемых NetBeans? Puce

Ваш Ответ

2   ответа
-4

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

а также

java -cp ".;\Program Files\Java\jre7\lib\jfxrt.jar"   HelloWorld
-1 На что ты отвечаешь? Вы не делаете ссылку на проблему в Q.
9

скомпилировать javafx 2.0 вручную.

This answer is specifically for JavaFX 2 versions before the release of Oracle Java 8. For Oracle JavaFX 8+, the JavaFX runtime is on the classpath, so you don't need to explicitly add it when compiling or JavaFX running applications.

Java включает JavaFX в jdk7u6 и выше (для Windows и Linux) и jdk7u4 и выше (для OSX).

Загрузите и используйте jdk7u6 +, и вам не нужно будет указывать файл jfxrt.jar в любом пути к классам, и все ваши проблемы, связанные с JavaFX, должны исчезнуть.

Вот ссылка наранняя двоичная сборка jdk7u6.

Для JavaFX 2.1 в Windows вам необходимо включить библиотеку jfxrt.jar в ваш classpath для компиляции (NetBeans сделает это автоматически, если вы используете ее настройки платформы JavaFX) и (если вы не правильно упаковали свое приложение с помощью javafxpackager или задачи JavaFX ant), также во время выполнения.

JavaFX 2.1 для Linux является предварительным выпуском (если вы его используете). Для предварительной версии Linux вам нужно было бы включить jfxrt.jar в ваш classpath как во время компиляции, так и во время выполнения, если среда выполнения JavaFX в Linux была настроена неправильно.

Вот пример компиляции командной строки и выполнения программы 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, если вы не хотите переопределить расположение по умолчанию для платформы.

Небольшое исправление: даже для предварительной версии JavaFX 2.1 для Linux jfxrt.jar не требуется в пути к классам при правильной настройке.
я создалjavafx-jira.kenai.com/browse/RT-22071 & quot; новое мультимедиа (источник) должно найти относительные ресурсы, аналогичные новому изображению (url) & quot ;, чтобы ваш новый запрос мультимедиа (& quot; msg.mp3 & quot;) работал так, как вы ожидали.
Внешний вид формы для идеи ресурса пришел изJavaFX deployment guide, section 4.3.1.
Спасибо, Пьюс, я обновил ответ, чтобы включить твои исправления.
Большое вам спасибо за драгоценности. Это очень полезно. Прежде чем я попытаюсь установить jdk7u6, я хотел бы увидеть, что необходимо для запуска моего кода с jdk7u4, который у меня уже есть. Как заставить мою программу работать так, как сейчас? Есть ли у вас какие-либо идеи?

Похожие вопросы