NoneJava .lang.NoClassDefFoundError при использовании JavaFX для воспроизведения звука из jar
Я хочу иметь возможность воспроизводить звук из mp3-файлов, для которых я видел сообщения, рекомендующие использование JavaFX. Я реализовал MediaPlayer и инициализировал JFXPanel, и в Eclipse все работает прекрасно.
Тем не менее, когда я экспортирую в исполняемый файл jar и пытаюсь запустить программу, я получаю следующее сообщение об ошибке: java.lang.NoClassDefFoundError: javafx/scene/media/MediaException.
Я предполагаю, что это происходит из-за исключения JavaFX в более новых версиях JRE (с которыми я столкнулся во время поиска решения). Мой главный вопрос - как мне отправить банку с JavaFX? Нужно ли включать банку, и если да, где я могу ее взять? Потому что Eclipse, кажется, не упаковывает JavaFX в мой исполняемый файл, если я не ошибаюсь.
Вот пример, который, для меня, уже вызывает это поведение:
// This would throw a java.lang.NoClassDefFoundError for the JFXPanel but is effectively the same problem
public class Test extends Application
{
public static void main(String[] Args)
{
launch(Args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
StackPane root = new StackPane();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Спасибо за помощь!
2 ответа
JavaFx был удален в JDK> = 11 и теперь является отдельным проектом opensurse [openjfx] ( https://openjfx.io/). И теперь сделать работу приложения javafx повсеместно труднее, но это непрерывная эволюция, и я думаю, что это хорошая документация [doc-image-live] ( https://openjfx.io/openjfx-docs/).
У меня было проблемное сравнение, когда я использовал для разработки JDK 1.8, но в моей версии java-система openjdk11, я думаю, что это тот же случай.
Ваш пример неверен, потому что не является приложением JavaFX. Приложение JavaFX должно расширять javafx.application.Application, и при главном вызове запуска метода этот метод будет вызывать запуск метода, унаследованный от Application.
Это простой пример Oracle
public class HelloWorld extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
PS: Когда вы говорите на языке Java, вы должны добавить версию Java, потому что мы не знаем вашу версию Java
Если вы предпочитаете не использовать JavaFX, альтернативным путем будет использование библиотек, созданных в JavaZOOM, для чтения файлов mp3. Я вижу много предложений на github, которые были получены из этого источника, например, https://github.com/goxr3plus/java-sound-libraries Но я не использовал эту конкретную библиотеку самостоятельно.
Я предпочел объединить JavaFX для графического интерфейса пользователя с javax.audio.sampled и библиотеку, которую я создал, для вывода которой используется java.sound.sampled.SourceDataLine. Но я никогда не удосужился реализовать чтение mp3. Я склонен выбирать маршрут ogg/vorbis при использовании сжатых аудио ресурсов.