# Java Projekt als ausführbare Jar Exportieren (Eclipse) Problem



## korbmeister (4. Jan 2013)

Hey Leute ich möchte mein Java Projekt (Ein Spiel) so Exportieren, dass ich es mit einem Doppelklick starten kann ohne Eclipse oder so, mir wurde empfohlen es mit Eclipse zu einer ausführbaren Jar zu exportieren. Gesagt getan nur höre ich bei meinem Spiel keinen Sound und sobald ich eine Münze berühre bleibt es einfach alles stehen (In Eclipse ist das natürlich nicht der Fall) hier die betreffenden Code Zeilen meines Programms:

Soundlib Klasse aus Quaxils Tut kopiert

```
import java.applet.*;
import java.net.*;
import java.util.*;

public class SoundLib {

	Hashtable<String, AudioClip> sounds;
	Vector<AudioClip> loopingClips;
	
	public SoundLib(){
		sounds = new Hashtable<String, AudioClip>();
		loopingClips = new Vector<AudioClip>();
	}
	
	public void loadSound(String name, String path){
		
	if(sounds.containsKey(name)){
		return;
	}
		
   URL sound_url = getClass().getClassLoader().getResource(path);
   sounds.put(name, (AudioClip)Applet.newAudioClip(sound_url));
	}
	
	public void playSound(String name){
		AudioClip audio = sounds.get(name);
		audio.play();
	}
	
	public void loopSound(String name){
		AudioClip audio = sounds.get(name);
		loopingClips.add(audio);
		audio.loop();
	}

	public void stopLoopingSound(){
     for(AudioClip c:loopingClips){
    	 c.stop();
     }
	}

}
```


```
soundlib = new SoundLib();
		soundlib.loadSound("musik", "sound/musik.wav");
		soundlib.loadSound("jump", "sound/jump.wav");
		soundlib.loadSound("münze", "sound/münze.wav");
		soundlib.playSound("musik");
```


```
public void berechne_münze_getroffen() {
		feld_x=px/30+z;
		feld_y=py/30;
		if(Map[feld_y][feld_x] == 3 ){
			Map[feld_y][feld_x] = 0;
			score += 1;
			soundlib.playSound("münze");
			münzen ++;
		}
```


----------



## Marco13 (5. Jan 2013)

Was wird denn bei einem
System.out.println((AudioClip)Applet.newAudioClip(sound_url));
ausgegeben?


----------



## korbmeister (5. Jan 2013)

sun.applet.AppletAudioClip@5ff90769
sun.applet.AppletAudioClip@66978886
sun.applet.AppletAudioClip@66844a08


----------



## Timothy Truckle (5. Jan 2013)

Wenn du das jar mal "mit der Hand" startest, gibts dann Stacktraces in der Console?

Und nur um sicherzugehen: dass Verzeuchnis in dem Deine Sound-Dateien liegen war Teil des Eclipse-Classpaths und wurde auch mit in's Jar gepackt?
Und wenn ja, hast Du die Zugriffspfade im Programm versehentlich relativ zum Projektordner?

bye
TT


----------



## korbmeister (5. Jan 2013)

Oh Gott das musst du für mich nochmal neu formulieren ich versteh nur Bahnhof, sollte vielleicht dazu erwähnen, dass ich Java erst seit 2 Wochen machen. Weiß nicht wie ichs "von Hand starte", was Stracktraces oder Classpaths sind sorry ich lad gleich mal ein Bild hoch, wenn das hilft.

EDIT: Directupload.net - ln4ev85s.png


----------



## Timothy Truckle (5. Jan 2013)

korbmeister hat gesagt.:


> Oh Gott das musst du für mich nochmal neu formulieren ich versteh nur Bahnhof, sollte vielleicht dazu erwähnen, dass ich Java erst seit 2 Wochen machen. Weiß nicht wie ichs "von Hand starte",




```
java -jar deineAnwendung.jar
```



korbmeister hat gesagt.:


> was Stracktraces oder Classpaths sind


Also Nach 2 Wochen sollte man schon mal einen Stacktrace (typische Java-Fehlermeldung in der Konsole) gesehen haben.
Let me google that for you
bye
TT


----------



## korbmeister (5. Jan 2013)

Er findet anscheinend die Audio Dateien nicht, hast recht.  Hab den Code als Batch Datei ausgeführt (KA ob das richtig ist, aber hat funktioniert) und das ist dann dabei  rausgekommen:
Directupload.net - 3i9fjc9v.png
Directupload.net - ygw4cjru.png


----------



## Marco13 (5. Jan 2013)

Jupp, auf diese 'null's wollte ich hinaus (die sollten mit dem angedeuteten System.out's auch ausgegeben werden). 

Wenn du "export as runnable JAR" machst, erscheint so ein Dialog mit einem Baum - wenn man den ausklappt, kann man sehen, ob für das Verzeichnis, wo die WAVs drinliegen, in dem Baum auch ein Häckchen gesetzt ist (d.h. ob sie mit exportiert werden). Wenn sie dabei sind, muss (ich mir nach etwas Schlaf)/(jemand sich) die Sache mit der URL nochmal genauer ansehen, um zu klären, warum die nicht gefunden wird.


----------



## korbmeister (5. Jan 2013)

Der Dialog von dem du sprichst erscheint bei mir nicht, bei mir siehts so aus. Directupload.net - 7rrwbyko.png
Wenn ich jedoch dann auf finish klicke kann ich sehen, dass die Sound dateien mit Exportiert werden:
Directupload.net - 9jlvdy3y.png


----------



## Kevin94 (5. Jan 2013)

Mir fallen da zwei Ansatzpunkte ein:
Zum einen wird ein der Pfad der URL bei getResource relativ zum Package der Klasse interpretier, wenn er nich mit eine 
	
	
	
	





```
/
```
 anfängt, das sollte bei dir allerdings nicht das Problem sein, da bei dir alle Klassen im Default-Package liegen. Du kannst mal die URL ausgeben um die Richtigkeit des Pfades zu überprüfen.
Zum anderen bin ich mir nicht sicher, ob Eclipse die Sound-Dateien auch in den richtigen Ordner in der .jar gelegt hat. Es kann sein, dass sie gar nicht enthalten sind oder in einem zusätzlichen Unterordner liegen. Das kann man am einfachsten kontrollieren, indem man die .jar in .zip umbennent und mit dem Explorer öffnet. Alternativ könnte man sich auch die Ausgabe von 
	
	
	
	





```
jar -tf nameDer.jar
```
 anschauen.


----------



## Marco13 (5. Jan 2013)

Ahja, bei Runnable JARs verwendet er die Launch Config. Dann wird es wohl schlicht an den Pfaden liegen. Da bin ich leider nicht so "versiert" - habe selten Runnable JARs mit Resources, müßte darum auch ein bißchen mit sowas wie
URL sound_url = getClass()[strike].getClassLoader()[/strike].getResource(path);
oder
soundlib.loadSound("musik", "*./*sound/musik.wav");
rumspielen, bis es passt - vielleicht kann jemand da gezielter helfen


----------



## korbmeister (5. Jan 2013)

Marco13 hat gesagt.:


> Ahja, bei Runnable JARs verwendet er die Launch Config. Dann wird es wohl schlicht an den Pfaden liegen. Da bin ich leider nicht so "versiert" - habe selten Runnable JARs mit Resources, müßte darum auch ein bißchen mit sowas wie
> URL sound_url = getClass()[strike].getClassLoader()[/strike].getResource(path);
> oder
> soundlib.loadSound("musik", "*./*sound/musik.wav");
> rumspielen, bis es passt - vielleicht kann jemand da gezielter helfen


 Ohne Erfolg.

Jar Datei mit Zip geöffnet schaut für mich alles richtig aus:Directupload.net - yliofudo.png

Problem bleibt weiterhin bestehen, als denke ich das irgendwas mit dem Pfad nicht stimmt könntet ihr mir da nen anderen geben der funktioniert oder gibt es nur die Möglichkeit?

So hab mir jetzt mal die Sound URL ausgeben lassen, müsste da statt bin nicht src stehen? 

file:/K:/Eclipse/Game%20Demo/bin/sound/musik.wav
file:/K:/Eclipse/Game%20Demo/bin/sound/jump.wav
file:/K:/Eclipse/Game%20Demo/bin/sound/m%c3%bcnze.wav


----------



## korbmeister (5. Jan 2013)

und wer ne Idee?


----------



## gst (5. Jan 2013)

korbmeister hat gesagt.:


> und wer ne Idee?


Nö. Ist dir in der Zwischenzeit schon was eingefallen, oder wartest du nur, bis dir jemand irgendwelche Wunderlösungen auf dem Silbertablett serviert, während du dir einen Lenz machst?


----------



## korbmeister (5. Jan 2013)

Nicht so, dass es mich interessieren würde was ein Gast schreibt, aber zunächst einmal habe ich nicht gesagt "hat man jemand schnell zeit mir ein vollaufähiges Spiel zu programmieren" sondern nur nach der Lösung für ein für mich unlösbares Problem, ich hab bereits dazu gegoogelt aber finde halt nix, und wie ich es selber beheben soll weiß ich einfach nicht. Außerdem ist das der Sinn von einem Forum und es ist nicht so, dass ich anderen nicht in Sachen die ich kann nicht helfe.


----------



## Kevin94 (5. Jan 2013)

Die Ausgabe der URL kann nicht stimmen. Das sind Dateien auf der Festplatte und nicht im .jar. Wenn das die Ausgabe ist, die kommt wenn du dier jar startest und als Pfade 
	
	
	
	





```
/sound/datei.wav
```
 verwendest, dann bin ich am Ende meiner Weisheit.
Theoretisch müsste so etwas wie 
	
	
	
	





```
jar:file:/K:/Eclipse/GameDemo.jar!/sound/musik.wav
```
 rauskommen. Du kannst auch mal versuchen, was passiert wenn du so eine URL manuell anlegst mit new URL und hartkodiertem, aboluten Pfad.


----------



## korbmeister (5. Jan 2013)

wenn ich mir system.out.println die sound_url ausgeben lasse, kommt in Eclipse das oben geschriebene raus bei der jar steht nur einmal null das war es. Mit  der Hardcodierten URL probier ich aus aber muss erstmal gucken wie das geht.

edit: ich versteh es einfach nicht die Sound Dateien werden doch genau wie die Bilder geladen und die sehe ich schließlich auch -.-'


----------



## Marco13 (6. Jan 2013)

"müsste da statt bin nicht src stehen? "

Kopier' die Wav's mal in's entsprechende bin-Unterverzeichnis...


----------



## Kevin94 (6. Jan 2013)

Das erledigt Eclipse beim Starten oder einem Clean automatisch. Ausserdem funktioniert das Starten als .jar nicht und dabei sollte weder bin noch src im Pfad auftauchen.


----------



## Spacerat (6. Jan 2013)

Das mal aufmerksam durchlesen...
http://www.java-forum.org/allgemeine-java-themen/143525-relative-pfade-arbeitsvereichnisse.html

Ich weis nicht, wie es in anderen IDEs aussieht, aber in Eclipse zumindest ist der Klassenpfad zu Entwicklungszeit anders gestrickt, als zur normalen Laufzeit. Alle Ressourcen werden @build mit in das bin-Verzeichnis kopiert und in Tests wird dieser dann auch verwendet.
Das Problem scheint aber in ganz anderes zu sein, nämlich CodeBase und DocumentBase. Bei normaler Ausführung aus einem Archiv sind beide Verzeichnisse gleich, in Testsitzungen innerhalb von Eclipse jedoch unterschiedlich. Mit meinem kleinem Tool (dem Link folgend, dass im roten Kasten weiter unten) ist das aber alles nicht mehr so wild, denn man kann sich URLs des Rootverzeichnis einer beliebigen Klasse (vorzugsweise eine aus dem Archiv, in welchem sich die Ressourcen befinden) besorgen und muss dann nur noch den Archivpfad dranhängen.


----------



## Firephoenix (6. Jan 2013)

Liegen denn die Dateien passend bei der .jar?

Wenn du in deinem Programm z.B. "sounds/xyz.wav" lädst, dann sollte die Ordnerstruktur so aussehen:

-meineJar.jar
-sounds
--xyz.wav
usw.

Gruß


----------



## korbmeister (6. Jan 2013)

Ja wie schon erwähnt so schaut es aus: Directupload.net - yliofudo.png

Danke für die anderen Vorschläge ich werde sie gleich mal in die tat umsetzen.


----------



## korbmeister (6. Jan 2013)

Firephoenix hat gesagt.:


> Liegen denn die Dateien passend bei der .jar?
> 
> Wenn du in deinem Programm z.B. "sounds/xyz.wav" lädst, dann sollte die Ordnerstruktur so aussehen:
> 
> ...



klappt danke.


----------



## Timothy Truckle (6. Jan 2013)

korbmeister hat gesagt.:


> und wer ne Idee?


Ohne meinen Stacktrace sage ich nichts...

bye
TT


----------



## korbmeister (6. Jan 2013)

Ne hab das Problem ja jetzt gefunden, weiß zwar nicht wieso aber der Sound Ordner muss mit der Jar Datei in einem Ordner liegen, wie Firephoenix es erwähnt hat, wie krieg ich es jetzt noch hin, dass wirklich alles in der Jar bleibt?


----------

