【发布时间】:2020-04-09 04:42:14
【问题描述】:
当我创建我的 maven 项目的 jar 包时,程序不再找到我的媒体文件。我从谷歌找到了几个类似的问题,但没有一个对我有帮助。
我已经尝试了所有这些选项:
- 文档库:在 IDE 上运行良好,jar 包抛出 MEDIA_UNAVAILABLE
// I get documentBase from the class which extends Application
String documentBase = Application.getHostServices().getDocumentBase();
Media media = new Media(documentBase + "src/main/resources/music/music.mp3");
- Paths.get:在 IDE 上运行良好,jar 包抛出 MEDIA_UNAVAILABLE
Media media = new Media(Paths.get("src/main/resources/music/music.mp3").toUri().toString());
- 获取资源:抛出 null
Media media = new Media(Audio.class.getResource("/music.mp3").toString());
- 输入流:抛出 null
InputStream in = Audio.class.getResourceAsStream("/music.mp3");
Media media = new Media(new InputStreamReader(in).toString());
- 带有 getClassLoader() 的输入流:抛出 null
InputStream in = Audio.class.getClassLoader().getResourceAsStream("/music.mp3");
Media media = new Media(new InputStreamReader(in).toString());
我的示例中的 Audio 类是一个抽象类,它通过静态方法和变量处理一切。我正在使用 Java 11。
编辑: 为示例添加了正确的路径。
【问题讨论】:
-
mp3 文件在类路径/jar 中的什么位置结束?根据您使用的 ide,
/resources/music.mp3或/music.mp3可能是部署后的正确路径(方法 3),或者可能不包含该文件。此外,假设您使用的是文件名不区分大小写的系统,使用错误的大小写可能会导致此问题; jar 条目区分大小写,即使在 Windows 上... -
顺便说一句:请忘记方法 4 和 5(或者最好记住那些不起作用):
InputStreamReader使用Object的toString实现,这意味着结果将类似于java.io.InputStreamReader@<some hex sequence>