【问题标题】:sound will play in eclipse but not in exported jar file声音将在 Eclipse 中播放,但不会在导出的 jar 文件中播放
【发布时间】:2016-08-10 14:08:00
【问题描述】:

运行 JAR 时不播放声音,但在 eclipse 中运行时播放。

这里是我加载剪辑的地方:(文件是从 jar 的目录中加载的,而不是从 jar 中加载的)

public void init(){
    System.out.println("grabbing Music");
    String currentDir = new File("").getAbsolutePath();
    name=new File(currentDir+"\\music\\").list();
    clip=new Clip[name.length];
    soundFile=new File[name.length];
    for(int x=0;x<name.length;x++){
        System.out.println(currentDir+"\\music\\"+name[x]);
        try {
            soundFile[x]= new File(currentDir+"\\music\\"+name[x]);
            AudioInputStream sound = AudioSystem.getAudioInputStream(soundFile[x]);
            DataLine.Info info= new DataLine.Info(Clip.class, sound.getFormat());
            clip[x] = (Clip) AudioSystem.getLine(info);
            clip[x].open(sound);
            clip[x].addLineListener(new LineListener(){
                public void update(LineEvent event) {
                    if (event.getType() == LineEvent.Type.STOP) {
                        event.getLine().close();
                    }
                }
            });
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        }
    }

}

在 Eclipse 中运行它时我没有收到任何错误。应该没有无效目录错误的可能,那到底是怎么回事?

-当 jar 在 CMD 中运行时,我没有收到任何错误或堆栈跟踪,所以它正在加载文件,它只是在调用 clip.start() 时没有运行它。所以我加载文件的方式与可运行的 jar 不兼容。

编辑:我觉得我加载音频错误,因此我粘贴了我用来加载文件的代码。在我的搜索中,我没有看到有人使用 File 加载声音文件。不知道是不是这个问题?

-切换到嵌入式资源也不起作用。

【问题讨论】:

  • 显而易见的问题:jar 是否包含声音文件?
  • 根据 Jar 文件的当前执行上下文,文件似乎正在从文件系统加载。两条路径可能不一样。考虑改用嵌入式资源

标签: java audio jar clip


【解决方案1】:

您的声音没有播放的原因很可能是它没有被编译到您的可运行 jar 中,因此无法找到。将其编译成可运行 jar 的最佳方法是在 eclipse 中创建一个源文件夹,然后在其中添加您的声音文件。然后它将被编译到你的 jar 中

【讨论】:

  • 它肯定可以找到文件,因为没有抛出fileNotFound异常。
  • 尝试用 WINRAR 打开你的可运行 jar,看看它是否在里面
  • 文件是从 jar 外部加载的。不在里面。
【解决方案2】:

我也为此苦苦挣扎。你需要使用

getClass().getSystemResource("pathToResourceFromClass")

例如,如果您的项目结构如下:

-项目名称

-----src

---------SomeClass.java

-----图片

---------SomeImage.png

然后从 SomeClass.java,你会使用

getClass().getSystemResource("images/SomeImage.png")

获取引用该文件的URL 对象。然后,您可以根据需要将该 URL 对象传递给 ImageIcon 的构造函数。

请注意,getClass().getResource() 不适用于 jar 文件中的图像或声音文件!!!我在这方面花了很多时间,getResource() 不起作用。对于 jar 文件中的资源,您必须使用 getSystemResource(..)

如果您对此有任何疑问,请告诉我。我很乐意澄清任何令人困惑的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多