Java 未在.JAR文件中播放的音乐

Java 未在.JAR文件中播放的音乐,java,jar,fxml,embedded-resource,javasound,Java,Jar,Fxml,Embedded Resource,Javasound,我试图在打开.JAR文件时播放歌曲。它在Netbeans中运行良好,但在打开.Jar文件时,只有scenechange按钮和这些场景中的图像显示出来 在FXML的控制器中,我初始化了一个播放歌曲的线程: @Override public void initialize(URL url, ResourceBundle rb) { PlaySong ps = new PlaySong(); Thread thread = new Thread(ps); thread.star

我试图在打开.JAR文件时播放歌曲。它在Netbeans中运行良好,但在打开.Jar文件时,只有scenechange按钮和这些场景中的图像显示出来

在FXML的控制器中,我初始化了一个播放歌曲的线程:

@Override
public void initialize(URL url, ResourceBundle rb) {
    PlaySong ps = new PlaySong();
    Thread thread = new Thread(ps);
    thread.start();

} 
public class PlaySong implements Runnable {

@Override
public void run() {
    playSong();
}

static void playSong(){
    try{
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("/src/maanedsdag2/AssetsLibrary/James Smith  - Just the Way You Are.wav").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();

        Thread.sleep(clip.getMicrosecondLength()/1000);
    } catch(Exception e){

    }
}
}
这将使用应播放歌曲的线程调用类:

@Override
public void initialize(URL url, ResourceBundle rb) {
    PlaySong ps = new PlaySong();
    Thread thread = new Thread(ps);
    thread.start();

} 
public class PlaySong implements Runnable {

@Override
public void run() {
    playSong();
}

static void playSong(){
    try{
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("/src/maanedsdag2/AssetsLibrary/James Smith  - Just the Way You Are.wav").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();

        Thread.sleep(clip.getMicrosecondLength()/1000);
    } catch(Exception e){

    }
}
}
我的目的是在通过initialize方法打开FXML时开始播放歌曲


希望你们能提供帮助。

你们的音乐文件应该在项目的“src”文件中,以便在JAR中部署。您应该使用“getResourceAsStream()”获取声音文件。

当您从IDE启动应用程序时,您可以访问src文件,因为JVM执行路径是您的项目文件夹

所以你会明白在一个罐子里你没有你的项目。在Jar中,执行路径是包含Jar的文件夹,您会同意,即使手动,您也不会在该文件夹中找到文件夹src

你需要考虑你的音乐曲目作为资源而不是文件。我建议你阅读:

但就你而言:

SomeClass.class.getResourceAsStream("relativePathfromSomeClasstoyourwavFile");

OS文件系统不会“看到”jar文件。改为使用一个URL,它可以

通常使用相对寻址方案,并将音频放在某种资源文件夹中。但是你也可以把音频放在调用它的类的同一个文件中。或者使用“绝对”地址引用项目的根目录(地址以字符“/”开头)。你的选择


上面的“duplicate”标记有代码示例。

我已将其放在src下的“AssetLibrary”文件夹中。我应该在哪里使用getResourceAsStream()?@AlexanderMicheelsenRol您可以试试这个:AudioInputStream AudioInputStream=AudioSystem.getAudioInputStream(this.getClass().getResourceAsStream(“/”+”文件路径到声音文件”);getResource()如果您使用URL,效果非常好。将wav文件放在根文件夹中是错误的,还是应该放在src的某个子文件夹中?最好的做法是使用一个专用的包,如%mybasepackage%.ressource,其中包含ressoruces,以及一个使用一些静态方法(如getMainAudioTheme())处理ressource的类返回您这样搜索的流,它可以从程序中的任何位置轻松访问(在src的子包中是这样),而这个答案是正确的(用于加载嵌入式资源)。我有一些建议:1)“文件夹”完全是一个带有“窗口系统”的操作系统概念,您所指的更准确地称为“目录”(在这些操作系统上表示为“文件夹”)。2) Jar中没有文件夹或目录,只有资源路径。3)
SomeClass.class
通常最好写为
this.getClass()
,原因很简单,后者只能在类的实例中使用-这将更有可能获得预期的上下文类加载器。。。。对于应用程序资源。
SomeClass.class
版本可能会在
main(…)
方法中调用,并可能导致为核心API设计的引导类加载程序。4)
“relativePath..”
不,使用
“/path/from/root/of/class/path”更安全些,这样它就独立于加载类的包了。要做到这一点,关键在于领先的
/
--说到这里,这一部分是“你需要考虑你的音乐曲目作为资源而不是一个文件。”哦,我忘记提到的一个技巧是:5)<代码> GETREST(..)<代码> >对于<代码> URL<代码>有时比<代码> GETRealSuffSturnScript(..)<代码>更安全,对于<代码>输入流< /代码>。原因是Java声音(特别是)需要一个可重新定位的流,而来自
getResourceAsStream(…)
的流通常不需要。但是为
Clip
类提供一个
URL
,它将根据需要加载资源<代码>}捕获(异常e){}
不要忽略异常!如果未记录潜在故障,至少转储堆栈跟踪。例如,
}catch(异常E){E.printStackTrace();}
这不是某种重复吗?试图从JAR中打开文件的问题已经出现了无数次。文件系统不包括jar文件的内部。使用URL来寻址这些资源。发现上周的副本。我知道还有很多可以追溯到几年前。