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

Dieses Thema im Forum "Java Basics - Anfänger-Themen" wurde erstellt von korbmeister, 4. Jan. 2013.

  1. korbmeister

    korbmeister Neues Mitglied

    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
    Code (Java):


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

    }
     
    Code (Java):

                    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");
    Code (Java):
    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 ++;
            }
     
  2. Marco13

    Marco13 Gesperrter Benutzer

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

    korbmeister Neues Mitglied

    sun.applet.AppletAudioClip@5ff90769
    sun.applet.AppletAudioClip@66978886
    sun.applet.AppletAudioClip@66844a08
     
  4. Timothy Truckle

    Timothy Truckle Neues Mitglied

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

    korbmeister Neues Mitglied

    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
     
    Zuletzt bearbeitet: 5. Jan. 2013
  6. Timothy Truckle

    Timothy Truckle Neues Mitglied

    Code (Text):
    java -jar deineAnwendung.jar
    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. korbmeister

    korbmeister Neues Mitglied

    Zuletzt bearbeitet: 5. Jan. 2013
  8. Marco13

    Marco13 Gesperrter Benutzer

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

    korbmeister Neues Mitglied

  10. Kevin94

    Kevin94 Neues Mitglied

    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
    Code (Text):
    /
    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
    Code (Text):
    jar -tf nameDer.jar
    anschauen.
     
  11. Marco13

    Marco13 Gesperrter Benutzer

    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 :oops:
     
  12. korbmeister

    korbmeister Neues Mitglied

    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
     
    Zuletzt bearbeitet: 5. Jan. 2013
  13. korbmeister

    korbmeister Neues Mitglied

    und wer ne Idee?
     
  14. gst

    gst Guest

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

    korbmeister Neues Mitglied

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

    Kevin94 Neues Mitglied

    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
    Code (Text):
    /sound/datei.wav
    verwendest, dann bin ich am Ende meiner Weisheit.
    Theoretisch müsste so etwas wie
    Code (Text):
    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.
     
  17. korbmeister

    korbmeister Neues Mitglied

    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 -.-'
     
    Zuletzt bearbeitet: 5. Jan. 2013
  18. Marco13

    Marco13 Gesperrter Benutzer

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

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

    Kevin94 Neues Mitglied

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

    Spacerat Guest

    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.
     
Die Seite wird geladen...