Java 在runnable jar-eclipse中包含音频文件
我发现这个问题的答案都不起作用,所以我不得不问: 我正在使用Eclipse,我有一个程序,我将其导出为可运行的jar,它会播放音频,但音频必须与导出的jar文件位于同一文件夹中,否则它不会播放。如何将其打包到可运行的jar中,使其不需要音频就可以在那里? PS:我用老式的方式做事,所以不使用构建系统(Maven或Gradle) 这是我的密码;按下按钮时播放音频文件:Java 在runnable jar-eclipse中包含音频文件,java,eclipse,runnable-jar,Java,Eclipse,Runnable Jar,我发现这个问题的答案都不起作用,所以我不得不问: 我正在使用Eclipse,我有一个程序,我将其导出为可运行的jar,它会播放音频,但音频必须与导出的jar文件位于同一文件夹中,否则它不会播放。如何将其打包到可运行的jar中,使其不需要音频就可以在那里? PS:我用老式的方式做事,所以不使用构建系统(Maven或Gradle) 这是我的密码;按下按钮时播放音频文件: AudioFormat audioformat = null; DataLine.Info
AudioFormat audioformat = null;
DataLine.Info info = new DataLine.Info(Clip.class, audioformat);
try {
Clip audioclip = (Clip) AudioSystem.getLine(info);
File audio1 = new File("audiofile.wav");
AudioInputStream audiostream = AudioSystem.getAudioInputStream(audio1);
audioformat = audiostream.getFormat();
audioclip.open(audiostream);
audioclip.start();
audiostream.close();
} catch (LineUnavailableException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnsupportedAudioFileException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
```
使用
getResourceAsStream
:
class Example {
void getAudioData() {
try (InputStream in = Example.class.getResourceAsStream("file.mp3")) {
// pass 'in' to your music player of choice.
// NB: If you can only pass 'File' or 'Path' objects, and not
// URL or InputStream objects, get another music playing library.
}
}
void alternateForm() {
musicPlayer.play(Example.class.getResource("file.mp3"));
// Use this form if your music player takes URLs and not InputStreams.
}
}
您的罐子最终看起来像这样:
jar tvf Mobbs8app.jar
1234 Wed 19 Jan 20:00 com/foo/mobbs8/Main.class
1234 Wed 19 Jan 20:00 com/foo/mobbs8/Example.class
1234 Wed 19 Jan 20:00 com/foo/mobbs8/file.mp3
其中Main.class
这是您的主类,包头为“package com.foo.mobbs8;”-getResourceAsStream
与类文件位于同一个“目录”中,而不管它可能位于何处(在磁盘上、在jar中、从网络加载-无所谓)
Eclipse应该将“src”目录中的任何非java文件视为要逐字包含在任何导出的jar中的文件,尽管您确实应该尽早转移到实际的构建系统
如果要将音频文件放入“根目录”(如中所示,它在jar中显示为
file.mp3
,而不是com/foo/mobbs8player/file.mp3
)-没问题。改为使用.getResourceAsStream(“/file.mp3”)
(注意前面的斜杠)。使用getResourceAsStream
:
class Example {
void getAudioData() {
try (InputStream in = Example.class.getResourceAsStream("file.mp3")) {
// pass 'in' to your music player of choice.
// NB: If you can only pass 'File' or 'Path' objects, and not
// URL or InputStream objects, get another music playing library.
}
}
void alternateForm() {
musicPlayer.play(Example.class.getResource("file.mp3"));
// Use this form if your music player takes URLs and not InputStreams.
}
}
您的罐子最终看起来像这样:
jar tvf Mobbs8app.jar
1234 Wed 19 Jan 20:00 com/foo/mobbs8/Main.class
1234 Wed 19 Jan 20:00 com/foo/mobbs8/Example.class
1234 Wed 19 Jan 20:00 com/foo/mobbs8/file.mp3
其中Main.class
这是您的主类,包头为“package com.foo.mobbs8;”-getResourceAsStream
与类文件位于同一个“目录”中,而不管它可能位于何处(在磁盘上、在jar中、从网络加载-无所谓)
Eclipse应该将“src”目录中的任何非java文件视为要逐字包含在任何导出的jar中的文件,尽管您确实应该尽早转移到实际的构建系统
如果要将音频文件放入“根目录”(如中所示,它在jar中显示为
file.mp3
,而不是com/foo/mobbs8player/file.mp3
)-没问题。改用.getResourceAsStream(“/file.mp3”)
(注意前面的斜杠)。哦,对不起。编辑我的问题。我知道我应该使用一个构建系统,但现在还是用老式的方式。无论如何,我在上面添加了我的代码;当按下按钮时,它会播放音频文件。还有,请原谅,我是个初学者,我在哪里打这个?jar-tvf…?jar-tvf只是命令行上的一个命令,用于显示jar的内容,您不必运行它,我包含它只是为了向您显示jar的外观;如果您的jar不工作,您可以检查它是否是由eclipse这样构建的。如果您不想使用命令行,也可以使用任何可视化zip工具打开jar。AudioSystem也有一个URL参数,所以只需使用:AudioSystem.getAudioInputStream(Mobbs8Player.class.getResource(“file.mp3”);哦,对不起。编辑我的问题。我知道我应该使用一个构建系统,但现在还是用老式的方式。无论如何,我在上面添加了我的代码;当按下按钮时,它会播放音频文件。还有,请原谅,我是个初学者,我在哪里打这个?jar-tvf…?jar-tvf只是命令行上的一个命令,用于显示jar的内容,您不必运行它,我包含它只是为了向您显示jar的外观;如果您的jar不工作,您可以检查它是否是由eclipse这样构建的。如果您不想使用命令行,也可以使用任何可视化zip工具打开jar。AudioSystem也有一个URL参数,所以只需使用:AudioSystem.getAudioInputStream(Mobbs8Player.class.getResource(“file.mp3”);