java - 导出到 .JAR 时不会抓取资源

标签 java eclipse audio jar executable-jar

我试图通过创建一个小型 2D 游戏来更好地理解 Java。我觉得最好的学习方式就是奋斗,所以我尽量不去寻求帮助来解决我遇到的任何问题;我只是自己解决它们。但是,我几乎尝试了所有无法在导出的游戏版本中播放背景音乐的方法。所有图像都可以工作,使用“getClass()”方法拉取的其他所有内容都可以工作,但音乐却不能。

抱歉,我必须放入BackgroundMusicManager类中的所有代码,但是因为我想在没有帮助的情况下做事,所以我的程序的第一个版本通常非常困惑,需要大量优化。简而言之,您必须了解事物在何处被调用和初始化以及诸如此类才能真正了解事物是如何工作的。

package com.cs.dd.audioManager;

import java.io.*;
import java.net.URL;
import java.net.URLDecoder;

import javax.sound.sampled.*;
import com.nickgirga.dd.main.*;

import sun.applet.Main;

public class BackgroundMusicManager implements Runnable {
    //URLs
    public URL mmBgMusicURL = getClass().getResource("/audio/backgroundMusic/casual.wav");

    //Files
    public File[] bgMusics = { new File(mmBgMusicURL.getFile()) };

    public File bgMusic = bgMusics[0];
    private static Clip clip;

    public static int newGameState;

    public static boolean enabled = true;
    public static boolean asPlaying = false;

    public static Thread bgMusicPlayer = new Thread(new BackgroundMusicManager());

    public void play () {
        if (enabled) {
            try {
                if (bgMusic != null) clip = AudioSystem.getClip();
                if (bgMusic != null) clip.open(AudioSystem.getAudioInputStream(bgMusic));
                if (bgMusic != null) clip.start();

                //System.out.println(bgMusics[0].getAbsolutePath());

                loopChecker();
                bgMusicPlayer.wait();

            } catch (LineUnavailableException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (UnsupportedAudioFileException e) {
                e.printStackTrace();
            } catch (Exception e) {
                //e.printStackTrace();
            }
        }
    }

    public void loopChecker () {
        while (true) {

            if (clip.getMicrosecondPosition() >= clip.getMicrosecondLength()) {
                bgMusicPlayer.notify();
            }

            if (!(GameState.state == newGameState)) {
                setClip();
            }
        }
    }

    public void setClip () {
        //System.out.println("setClip");
        newGameState = GameState.state;
        if (GameState.state == 0) {
            clip.stop();
            bgMusic = bgMusics[0];
            bgMusicPlayer.notify();
        } else {
            if (GameState.state == 1) {
                clip.stop();
                bgMusic = bgMusics[0];
                bgMusicPlayer.notify();
            } else {
                clip.stop();
                bgMusic = null;
                bgMusicPlayer.notify();
            }
        }
    }

    @Override
    public void run() {
        while (true) {
            play();
        }
    }
}

将其导出为包含库的 JAR 后,控制台显示:

java.io.FileNotFoundException: audio\backgroundMusic\casual.wav (The system cannot find the path specified)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.sun.media.sound.WaveFloatFileReader.getAudioInputStream(Unknown Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at com.cs.dd.audioManager.BackgroundMusicManager.play(BackgroundMusicManager.java:33)
    at com.cs.dd.audioManager.BackgroundMusicManager.run(BackgroundMusicManager.java:89)
    at java.lang.Thread.run(Unknown Source)

我提取了 JAR,并在 FileNotFoundException 所指向的位置准确地找到了该文件,所以我感到非常困惑。在 Eclipse 中运行时音频可以工作。图像仍然显示在导出中。为什么它可以处理图像,但不能处理音频?

非常感谢任何帮助!谢谢!!!

最佳答案

代替

getClass().getResource("/audio/backgroundMusic/casual.wav");

使用

getClass().getClassLoader().getResourceAsStream("/audio/backgroundMusic/casual.wav")

这样,它将从根查找,而不是当前调用类的路径

关于java - 导出到 .JAR 时不会抓取资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271973/

相关文章:

java - 如何在 Jenkins Pipeline 中创建一个阶段来检查特定 JSON 响应的 URL 并确定成功/失败?

java - Eclipse - Android - 无法调试

android - 我为免费和高级应用程序使用哪些软件包?

javascript - 当媒体停止缓冲时如何使音频事件警报

android - 在Android中编辑声音文件

audio - 单个 MIDI 轨道可以同时播放多个音符吗?

java - 在java中作为android静态java模块打开文件

Java 生成目录但不生成文件

java - Jsoup 谷歌搜索结果

android - 在 Eclipse MAT 中,类(class)末尾的美元符号是什么意思?