【问题标题】:NetBeans getting resource inside JAR file?NetBeans 在 JAR 文件中获取资源?
【发布时间】:2015-07-26 15:46:52
【问题描述】:

我一直在尝试在我的 Netbeans Java 项目中包含一些图像和声音,我在谷歌上搜索了所有我尝试并实现的答案,但有些在 Netbeans 中运行音频文件时正确播放了音频文件,但没有当它实际构建为 JAR 文件时。

我在执行 JAR 文件时难以播放声音。据我了解,项目中的包/文件夹被编译并内置到 JAR 文件中。

谁能指出我如何正确获取资源的正确方向?

我的代码如下:

public void SND_REQUEST() {
    AudioInputStream clipNameAIS;
    Clip clipNameClip = null;
    try {
        clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/Sounds/Cat.wav"));
        clipNameClip = AudioSystem.getClip();
        clipNameClip.open(clipNameAIS);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
    }
    clipNameClip.setFramePosition(0);
    clipNameClip.start();
}

资源结构:


更新 - 22:45:

在 Netbeans 中运行时似乎可以工作,但在可执行 Jar 文件中却不行。 我已经尝试了两种方式,不适张贴图片: 文件肯定在里面,感谢 1 Nik 的帮助。

更新代码:

   public void SND_REQUEST() {
        AudioInputStream clipNameAIS;
        Clip clipNameClip = null;
        try {
            clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));
            clipNameClip = AudioSystem.getClip();
            clipNameClip.open(clipNameAIS);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
        }
        clipNameClip.setFramePosition(0);
        clipNameClip.start();
    }

结果:

打印堆栈跟踪:

java.lang.NullPointerException
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:134)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113)
    at overtimesystem.OvertimeSystem.SND_REQUEST(OvertimeSystem.java:293)
    at overtimesystem.OvertimeSystem$ADD.actionPerformed(OvertimeSystem.java:148)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6525)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6290)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
    at java.awt.Container.dispatchEventImpl(Container.java:2278)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:702)
    at java.awt.EventQueue$3.run(EventQueue.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:724)
    at java.awt.EventQueue$4.run(EventQueue.java:722)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

更新 - 工作::

啊,找到问题了,感谢您的帮助。没想到在 JOptionPane msgbox 中传递 E.printstack 跟踪,哈哈 :) 看来我需要 BufferReader 才能正确流式传输。路径也是正确的。请查看适用于该项目的更新代码 :) 再次感谢!!!

public void SND_REQUEST() {
    AudioInputStream clipNameAIS;
    Clip clipNameClip = null;
    try {
        InputStream audioSrc = getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav");
        InputStream bufferedIn = new BufferedInputStream(audioSrc);
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);

        clipNameClip = AudioSystem.getClip();
        clipNameClip.open(audioStream);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
        return;
    }
    clipNameClip.setFramePosition(0);
    clipNameClip.start();
}

【问题讨论】:

  • 我认为路径应该是"overtimesystem/Sounds/Cat.wav"
  • 如果您以 zip 格式打开 JAR 文件,您能看到 .wav 文件吗?使用在 jar 中找到的路径。

标签: java netbeans getresource


【解决方案1】:

谁能指出我如何正确获取资源的正确方向?

假设资源在创建的 jar 文件中,您可以将路径定义为相对于包根目录的绝对路径:

clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));

注意开头的/,将路径定义为绝对路径(相对于包根目录)。您还可以定义相对路径(相对于调用类)。例如,如果调用类在/overtimesystem/Images/ 包中,您可以使用../Sounds/Cat.wav 访问资源

【讨论】:

  • @AlpaxJ1 打印出堆栈跟踪(例如e.printStackTrace();)以准确验证异常是什么
  • 请查看我的打印堆栈跟踪更新,说空指针异常?路径不正确,不能...
  • 啊,在 JAR 文件中运行它会出现此错误:stackoverflow.com/questions/5529754/…
  • @AlpaxJ1,该链接建议(如果是这种情况)您应该获得IOException 而不是NullPointerException。但如果它有效,恭喜。
猜你喜欢
  • 2018-03-29
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2011-01-22
  • 2015-01-12
  • 2011-04-19
相关资源
最近更新 更多