Search code examples
javanetbeansgetresource

NetBeans getting resource inside JAR file?


I have been trying to include some images and sounds in my Netbeans Java project and I have searched all over google looking for answers all of which I have tried and implemented but some play the audio file correctly when running it inside Netbeans but not when its actually built as a JAR file.

I am struggling to play a sound when executing the JAR File. As i understand it, the packages/folders inside the project are compiled and built into the JAR file.

Can anyone point me in the right direction as to how I correctly get a resource?

My code is as below:

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();
}

Resource Stucture:

enter image description here


UPDATE - 22:45:

It seems to work when running inside Netbeans, but not in the executable Jar file. I have tried both ways, ill post images: The file is certainly in ther, thanks for the help on that 1 Nik.

enter image description here

Updated code:

   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();
    }

Result:

enter image description here

Print Stack Trace:

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)

UPDATE - WORKS::

AHH, FOUND THE ISSUE, Thanks for your help. Didnt think of passing the E.printstack trace in a JOptionPane msgbox lol :) It seems i needed the BufferReader for it to stream correctly. Also the path is correct. Please see my updated code which works for the project :) THANKS AGAIN!!!

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();
}

Solution

  • Can anyone point me in the right direction as to how i correctly get a resource?

    Presuming the resources are within the created jar file, you can define the path as absolute relative to the package root:

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

    Note the / at the beginning, defining the path as absolute (relative to the package root). You can also define a relative path (relative to the calling class). For instance, if the calling class is within the /overtimesystem/Images/ package, you can access the resource with ../Sounds/Cat.wav