java.lang.NoClassDefFoundError при использовании JavaFX для воспроизведения звука из jar - PullRequest
0 голосов
/ 02 июля 2019

Я хочу иметь возможность воспроизводить звук из mp3-файлов, для которых я видел сообщения, рекомендующие использование JavaFX. Я реализовал MediaPlayer и инициализировал JFXPanel, и в Eclipse все работает прекрасно.

Тем не менее, когда я экспортирую в работающий флягу и пытаюсь запустить программу, я получаю следующее сообщение об ошибке: 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 ]

2 голосов
/ 02 июля 2019

JavaFx был удален в JDK> = 11 и теперь представляет собой отдельный проект opensurse [openjfx] (https://openjfx.io/).). Теперь сделать создание приложения javafx повсеместно труднее, но этоэто непрерывная эволюция, и я думаю, что это хорошая документация [doc-image-live] (https://openjfx.io/openjfx-docs/#modular).

У меня было проблемное сравнение, когда я использовал для разработки JDK 1.8, но в моей версии Java-системаopenjdk11, я думаю, что это тот же случай.

Ваш пример неверен, потому что не является приложением JavaFX. Приложение JavaFX должно расширять javafx.application.Application и в основном вызовеметод запуск , этот метод вызовет метод start , унаследованный от 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: Когда вы говорите на языке javafx, вы должны добавить версию java, потому что мы не знаем вашу версию java

0 голосов
/ 03 июля 2019

Альтернативный путь, если вы предпочитаете не использовать JavaFX, - использовать библиотеки, созданные в JavaZOOM, для чтения файлов mp3. Я вижу много предложений на github, которые были получены из этого источника, например, https://github.com/goxr3plus/java-sound-libraries Но я сам не использовал эту конкретную библиотеку.

Я предпочел объединить JavaFX для графического интерфейса пользователя с javax.audio.sampled и библиотеку, которую я создал, для вывода которой используется java.sound.sampled.SourceDataLine. Но я никогда не удосужился реализовать чтение mp3. Я склонен выбирать маршрут ogg / vorbis при использовании сжатых аудиоресурсов.

...