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

12
  1. #1
    korbmeister


    Java Projekt als ausführbare Jar Exportieren (Eclipse) Problem
    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
    Java Code:
    1.  
    2.  
    3. import java.applet.*;
    4. import java.net.*;
    5. import java.util.*;
    6.  
    7. public class SoundLib {
    8.  
    9. Hashtable<String, AudioClip> sounds;
    10. Vector<AudioClip> loopingClips;
    11.  
    12. public SoundLib(){
    13. sounds = new Hashtable<String, AudioClip>();
    14. loopingClips = new Vector<AudioClip>();
    15. }
    16.  
    17. public void loadSound(String name, String path){
    18.  
    19. if(sounds.containsKey(name)){
    20. return;
    21. }
    22.  
    23. URL sound_url = getClass().getClassLoader().getResource(path);
    24. sounds.put(name, (AudioClip)Applet.newAudioClip(sound_url));
    25. }
    26.  
    27. public void playSound(String name){
    28. AudioClip audio = sounds.get(name);
    29. audio.play();
    30. }
    31.  
    32. public void loopSound(String name){
    33. AudioClip audio = sounds.get(name);
    34. loopingClips.add(audio);
    35. audio.loop();
    36. }
    37.  
    38. public void stopLoopingSound(){
    39. for(AudioClip c:loopingClips){
    40. c.stop();
    41. }
    42. }
    43.  
    44. }


    Java Code:
    1.  
    2. soundlib = new SoundLib();
    3. soundlib.loadSound("musik", "sound/musik.wav");
    4. soundlib.loadSound("jump", "sound/jump.wav");
    5. soundlib.loadSound("münze", "sound/münze.wav");
    6. soundlib.playSound("musik");


    Java Code:
    1. public void berechne_münze_getroffen() {
    2. feld_x=px/30+z;
    3. feld_y=py/30;
    4. if(Map[feld_y][feld_x] == 3 ){
    5. Map[feld_y][feld_x] = 0;
    6. score += 1;
    7. soundlib.playSound("münze");
    8. münzen ++;
    9. }

  2. #2
    Marco13


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

  3. #3
    korbmeister


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

  4. #4
    Timothy Truckle


    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

  5. #5
    korbmeister


    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

  6. #6
    Timothy Truckle


    Zitat Zitat von korbmeister Beitrag anzeigen
    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",
    Code:
    java -jar deineAnwendung.jar
    Zitat Zitat von korbmeister Beitrag anzeigen
    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

  7. #7
    korbmeister


    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

  8. #8
    Marco13


    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.

  9. #9
    korbmeister


    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

  10. #10
    Kevin94


    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 [C]/[/C] 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 [C]jar -tf nameDer.jar[/C] anschauen.

  11. #11
    Marco13


    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().getClassLoader().getResource(path);
    oder
    soundlib.loadSound("musik", "./sound/musik.wav");
    rumspielen, bis es passt - vielleicht kann jemand da gezielter helfen

  12. #12
    korbmeister


    Zitat Zitat von Marco13 Beitrag anzeigen
    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().getClassLoader().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

  13. #13
    korbmeister


    und wer ne Idee?

  14. #14
    gst

    Zitat Zitat von korbmeister Beitrag anzeigen
    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?

  15. #15
    korbmeister


    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.

  16. #16
    Kevin94


    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 [C]/sound/datei.wav[/C] verwendest, dann bin ich am Ende meiner Weisheit.
    Theoretisch müsste so etwas wie [C]jar:file:/K:/Eclipse/GameDemo.jar!/sound/musik.wav[/C] rauskommen. Du kannst auch mal versuchen, was passiert wenn du so eine URL manuell anlegst mit new URL und hartkodiertem, aboluten Pfad.

  17. #17
    korbmeister


    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 -.-'

  18. #18
    Marco13


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

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

  19. #19
    Kevin94


    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.

  20. #20
    Spacerat

    Das mal aufmerksam durchlesen...
    http://www.java-forum.org/allgemeine...eichnisse.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.

12

Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren