导出到.JAR时不会获取资源

时间:2016-10-26 20:56:59

标签: 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中运行时有效。图像仍显示在导出中。为什么它适用于图像,而不是音频?

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

1 个答案:

答案 0 :(得分:1)

而不是

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

使用

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

通过这种方式,当前调用类

的路径从根而不是查看