升级NetBeans Flatpak后JavaFX媒体播放器UNKNOWN异常求助
问题描述
本地使用NetBeans 12.6多年,2023-05-05安装了Apache NetBeans IDE 17的Flatpak包(Manjaro系统),升级后项目中JavaFX媒体播放器异常,播放WAV/MP3均失败,抛出UNKNOWN类型的MediaException。
已将Java平台从JDK19切换至JDK20,但NetBeans信息中心显示使用Java 11.0.18,系统java -version显示Java 20,怀疑Flatpak沙箱机制导致,但不确定。项目未修改代码,升级前正常运行。
触发异常代码:
public void playRandomTrack() { var random = new Random(); int randomInt = random.nextInt(this.trackPaths.size()); //Ensure that timecode file is not selected while (this.trackPaths.get(randomInt).equals(TIMECODE_FILE)) { randomInt = random.nextInt(this.trackPaths.size()); } var path = this.trackPaths.get(randomInt); var filePath = path.toString(); var filePathURI = path.toUri().toString(); System.out.println("Music Track Loaded: " + filePathURI); System.out.println("File exists: " + Files.exists(path)); var media = new Media(filePathURI); var newPlayer = new MediaPlayer(media); }
程序输出:
-------------< com.protonmail.sarahszabo.mizar.core:Mizar >------------- Building Mizar 1.0 --------------------------------[ jar ]--------------------------------- --- exec-maven-plugin:3.1.0:exec (default-cli) @ Mizar --- Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=gasp May 05, 2023 3:54:46 PM com.sun.javafx.application.PlatformImpl startup WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @7923f745' Gtk-Message: 15:54:46.418: Failed to load module "xapp-gtk3-module" Gtk-Message: 15:54:46.418: Failed to load module "canberra-gtk-module" Music Track Loaded: file:///home/sarah/NetBeansProjects/Mizar/Music/NIHILISM.A.opus.mp3 File exists: true May 05, 2023 3:54:51 PM com.protonmail.sarahszabo.mizar.ui.MizarUIUtils lambda$getStandardUncaughtExceptionHandler$2 SEVERE: null java.lang.RuntimeException: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at com.protonmail.sarahszabo.mizar.ui.MizarUIUtils.lambda$getStandardUncaughtExceptionHandler$2(MizarUIUtils.java:141) at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:316) at java.base/java.lang.Thread.run(Thread.java:1623) Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:147) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:518) at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:421) at com.protonmail.sarahszabo.mizar.ui.MizarAudioPlayer.playRandomTrack(MizarAudioPlayer.java:103) at com.protonmail.sarahszabo.mizar.ui.MizarAudioPlayer.<init>(MizarAudioPlayer.java:56) at com.protonmail.sarahszabo.mizar.ui.MizarUI.lambda$start$1(MizarUI.java:135) at com.protonmail.sarahszabo.mizar.ui.MizarUIUtils.lambda$showProgressBarDialog$10(MizarUIUtils.java:461) ... 7 more Caused by: com.sun.media.jfxmedia.MediaException: Could not create player! at com.sun.media.jfxmediaimpl.NativeMediaManager.getPlayer(NativeMediaManager.java:297) at com.sun.media.jfxmedia.MediaManager.getPlayer(MediaManager.java:118) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:474) ... 12 more
POM依赖:
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>${javafx.version}</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>${javafx.version}</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-swing</artifactId> <version>${javafx.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-media --> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-media</artifactId> <version>${javafx.version}</version> </dependency>
系统配置:
Kernel: 6.1.25-1-MANJARO arch: x86_64 bits: 64 compiler: gcc v: 12.2.1 parameters: BOOT_IMAGE=/@/boot/vmlinuz-6.1-x86_64 root=UUID=f11386cf-342d-47ac-84e6-484b7b2f377d rw rootflags=subvol=@ radeon.modeset=1 nvdia-drm.modeset=1 quiet cryptdevice=UUID=059df4b4-5be4-44d6-a23a-de81135eb5b4:luks-disk root=/dev/mapper/luks-disk apparmor=1 security=apparmor resume=/dev/mapper/luks-swap udev.log_priority=3 Desktop: KDE Plasma v: 5.27.4 tk: Qt v: 5.15.8 wm: kwin_x11 dm: SDDM Distro: Manjaro Linux base: Arch Linux Machine: Type: Desktop Mobo: ASUSTeK model: PRIME X570-PRO v: Rev X.0x serial: <filter> UEFI: American Megatrends v: 4408 date: 10/27/2022 CPU: Info: model: AMD Ryzen 9 5950X socket: AM4 bits: 64 type: MT MCP arch: Zen 3+ gen: 4 level: v3 note: check built: 2022 process: TSMC n6 (7nm) family: 0x19 (25) model-id: 0x21 (33) stepping: 0 microcode: 0xA201016 Topology: cpus: 1x cores: 16 tpc: 2 threads: 32 smt: enabled cache: L1: 1024 KiB desc: d-16x32 KiB; i-16x32 KiB L2: 8 MiB desc: 16x512 KiB L3: 64 MiB desc: 2x32 MiB Speed (MHz): avg: 2812 high: 4100 min/max: 2200/6358 boost: disabled base/boost: 4100/5050 scaling: driver: acpi-cpufreq governor: schedutil volts: 1.1 V Graphics: Device-1: NVIDIA GA104 [GeForce RTX 3070] vendor: ASUSTeK driver: nvidia v: 530.41.03 alternate: nouveau,nvidia_drm non-free: 530.xx+ status: current (as of 2023-03) arch: Ampere code: GAxxx process: TSMC n7 (7nm) built: 2020-22 pcie: gen: 4 speed: 16 GT/s lanes: 8 link-max: lanes: 16 bus-ID: 0b:00.0 chip-ID: 10de:2484 class-ID: 0300 Device-2: AMD Cape Verde PRO [Radeon HD 7750/8740 / R7 250E] vendor: VISIONTEK driver: radeon v: kernel alternate: amdgpu arch: GCN-1 code: Southern Islands process: TSMC 28nm built: 2011-20 pcie: gen: 3 speed: 8 GT/s lanes: 8 link-max: lanes: 16 ports: active: DP-3,DP-4 empty: DP-1, DP-2, DP-5, DP-6 bus-ID: 0c:00.0 chip-ID: 1002:683f class-ID: 0300 temp: 56.0 C Display: x11 server: X.Org v: 21.1.8 with: Xwayland v: 23.1.1 compositor: kwin_x11 driver: X: loaded: modesetting,nvidia dri: radeonsi gpu: radeon display-ID: :0 screens: 1 Info: Processes: 869 Uptime: 2d 3h 15m wakeups: 0 Init: systemd v: 252 default: graphical tool: systemctl Compilers: gcc: 12.2.1 alt: 10 clang: 15.0.7 Packages: 2199 pm: pacman pkgs: 2142 libs: 503 tools: pamac,yay pm: flatpak pkgs: 40 pm: snap pkgs: 17 Shell: Bash (su) v: 5.1.16 running-in: yakuake inxi: 3.3.26
排查解决步骤
1. 修正Flatpak下NetBeans的JDK版本问题
Flatpak包自带JDK11,会忽略系统JDK,需手动指定:
- 打开NetBeans,进入
Tools > Java Platforms - 点击
Add Platform,选择Standard Java Platform - 导航到系统JDK20的安装路径(通常为
/usr/lib/jvm/java-20-openjdk或类似路径) - 添加完成后,将该JDK设置为项目默认平台
- 检查项目的
Project Properties > Libraries,确认使用JDK20
2. 解决Flatpak沙箱权限问题
Flatpak默认限制对用户目录的访问,赋予NetBeans音乐文件目录权限:
- 终端执行:
flatpak override org.apache.netbeans --filesystem=/home/sarah/NetBeansProjects/Mizar/Music - 若需访问整个Home目录,执行:
flatpak override org.apache.netbeans --filesystem=home - 重启NetBeans后测试播放
3. 验证JavaFX媒体依赖与本地库兼容性
JavaFX Media依赖系统本地媒体库(如GStreamer),Flatpak环境可能缺少相关组件:
- 安装Flatpak的GStreamer扩展:
flatpak install org.freedesktop.Platform.GStreamer.gstreamer1-plugins-ugly - 确认项目JavaFX版本(20.0.1)与JDK20匹配
- 修改Maven exec插件,添加模块化运行参数,消除
Unsupported JavaFX configuration警告:<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.protonmail.sarahszabo.mizar.ui.MizarUI</mainClass> <arguments> <argument>--module-path</argument> <argument>${project.build.directory}/modules</argument> <argument>--add-modules</argument> <argument>javafx.controls,javafx.fxml,javafx.media</argument> </arguments> </configuration> </plugin>
4. 测试基础媒体播放功能
创建最小化测试项目,排除原项目代码问题:
import javafx.application.Application; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; import javafx.stage.Stage; import java.nio.file.Paths; public class MediaTest extends Application { @Override public void start(Stage stage) { String mediaPath = Paths.get("/home/sarah/NetBeansProjects/Mizar/Music/NIHILISM.A.opus.mp3").toUri().toString(); Media media = new Media(mediaPath); MediaPlayer player = new MediaPlayer(media); player.play(); player.setOnError(() -> System.out.println("Error: " + player.getError().getMessage())); } public static void main(String[] args) { launch(args); } }
- 在NetBeans中运行该类,若异常消失则说明原项目存在其他配置问题
5. 备选方案:使用非Flatpak版本的NetBeans
若以上步骤无效,卸载Flatpak版,安装Manjaro仓库中的NetBeans:
- 终端执行:
sudo pacman -S netbeans - 该版本直接使用系统JDK,避免沙箱权限问题
内容的提问来源于stack exchange,提问作者Sarah Szabo
相关产品推荐
相关产品推荐

