Java sound Spielt nicht in JAR?

2 Antworten

Das wird den Pfad nicht finden. Im Endeffekt wirst du da wohl den Pfad anders angeben und den Ressourcen-Zugriff anders gestalten müssen.

Wie genau, kann ich dir schlecht sagen, ich habe bisher nur wenig mit JARs gearbeitet. War da aber auch gefrickle, bis es funktioniert hat.

Wenn ein Java-Programm als jar-Datei ausgeliefert werden soll, muss die jar-Datei alles enthalten, was das Programm braucht. Die Audiodatei muss als sogenannte Resource in der jar-Datei vorhanden sein. Die üblichen Java-Entwicklungsumgebungen bieten schon die Möglichkeit, festzulegen, welche Resourcen in eine jar-Datei kopiert werden sollen, aber die Bedienung der Entwicklungsumgebungen ist leider so uneinheitlich, dass ich dazu nichts allgemeingültiges sagen kann.

Tip: Du könntest zunächst einmal prüfen, was in deiner jar-Datei eigentlich drin ist. Das geht ganz einfach, weil ein jar-Datei nichts anderes als eine zip-Datei ist. Ein Programm, mit dem du den Inhalt von zip-Dateien ansehen kannst, kannst du auch benutzen, um dir anzeigen zu lassen, was in einer jar-Datei so alles drin ist. Prüfe also, ob die Datei audio.wav in der jar-Datei enthalten ist.

Wenn die wav-Datei in der jar-Datei enthalten ist, ist die nächste Frage, wie der Zugriff erfolgen kann. Das ist immer ein trickreiches Thema. Der von dir gezeigte Code könnte funktionieren, wenn das ganze src-Verzeichnis deines Projekts in die jar-Datei kopiert wird. Das kann man machen, und für einen ersten Versuch, die Dinge zum Laufen zu bringen, ist das nicht einmal ungeschickt.

Üblicher ist es, Resourcen - also Sounddateien, Bitmaps, Textdateien u.s.w - in ein Resourcenverzeichnis zu tun und nur dieses Resourcenverzeichnis in die jar-Datei zu kopieren. Das kann man bei Eclipse irgendwie einstellen, suche mal nach "Eclipse: copy resource files to output directory"

Zum Zugriff auf eine Resource mache ich meist so:

Class classOfMain;
InputStream is;

classOfMain= Main.class; //  Main ist die Klasse des Hauptprogramms
is = classOfMain.getResourcesAsStream("res/audio.wav");
AudioInputStream stream = AudioSystem.getAudioInputStream(file);

Dabei ist "res/audio.wav" relativ zum Verzeichnis build/classes zu lesen. Wenn du die Audiodatei dort nicht in ein Unterverzeichnis res tust, sondern direkt in build/classes ablegt, musst du "audio.wav" schreiben und wenn du das ganze src-Verzeichnis in build/classes vorhältst, muss das Argument von getResourceAsStream natürlich "src/audio.wav" lauten.

Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler