Java Spiel eintwickelt, in eine runnable Jar exportiert, Probleme auf anderen Rechnern

Cinematic

Lt. Commander
Registriert
Dez. 2010
Beiträge
1.197
Habe ein Tetris Spiel geschrieben und habe es ein paar Freunden als .jar geschickt.
Ein Mac User konnte es ausführen, allerdings fehlte die Musik.
Ein Win7 User bekamt die Fehlermeldung "Java Exception has occurred".
Und noch ein anderer Win7 User bekam gar nichts, weder eine Fehlermeldung, noch das Spiel startete.
Achso, bei mir (Win 7) läuft die .jar fehlerfrei, mit Musik.

Beim googlen habe ich herausgefunden, dass wohl manche Abhängigkeiten nicht einfach so in einer .jar gespeichert werden können, z.B. alle "drittklassen" von awt oder so.
Habs nicht wirklich ganz verstanden, deswegen frage ich hier nach... was kann ich tun, um es "richtig" zu exportieren in ein Format, was meine Freunde auch noch eclipse oder sonstige IDEs ausführen können?

Falls jemand meine .jar bei sich testen möchte, hier könnt ihr sie runterladen:

https://drive.google.com/file/d/0B-Ry0324o-VhQ0FSdndXTXpZSzg/view?usp=sharing

Sie ist 60MB groß, weil ich als AudioInputStream nur .wav nehmen konnte, und da nur eine 6min lange, 60MB große .wav hatte.
 
Bei mir z.B. funktioniert die Musik auch nicht.
Manche Jars brauchen einen Cache, daher funktioniert es nicht immer, dass man einfach eine Jar Datei hat und versucht aus dieser Daten zu extrahieren. Am besten beim ersten ausführen die Dateien in einen Ordner wo die Datei ist entpacken und dann nutzen. Das sollte helfen.
 
Zuletzt bearbeitet:
Ohne code kann man dir nur bedingt helfen. Könnte an falschen Pfaden liegen & nullpointerexception zeigen dann auf die Musikdateien
 
Wie kann ich euch den Code am besten zeigen? Hab 13 Klassen oder so. Gibt es eine Möglichkeit ganze Projekte aus Eclipse auf z.B. pastebin.com hochzuladen? (Also nicht mit den Dateien, sondern nur die Klassen mit dem Code).

Übrigens, wer das Tetris ein bisschen spielen möchte, mit Q dreht man, Pfeiltasten steuern, und Leertaste Block lassen bis er kollidiert.
 
Eclipse bietet eine Export Funktion, mit der man Projekte einfach zippen kann. Die Datei hier hochladen.

Ideal wäre es IMHO aber, das Projekt auf Github oder Bitbucket einzustellen. Du nutzt doch ohnehin eine Versionsverwaltung? Falls es nicht öffentlich sein soll, könntest Du auf Bitbucket auf Anfrage Zugang erteilen.
 
Schreib dir doch einen "Logger" der alle Konsolenmeldungen in eine Textdatei schreibt. Dann lässt du dir diese Textdatei einfach schicken.
 
Zuletzt bearbeitet:
Naja für Code ist Github optimal. Sonst ja, reigas Vorschlag ist die beste Lösung. Schreib dir einen Logger, dann findest du Fehler viel schneller.
 
Ok, hier mein gezipptes Projekt:

https://drive.google.com/file/d/0B-Ry0324o-VhczAwWW1Iem9GLUU/view?usp=sharing

Habe die Soundfiles aber rausgenommen, sonst wäre das wieder 60MB groß geworden.
Wie man einen Logger schreibt, weiß ich noch gar nicht.
Habe jetzt mein erstes Semester Informatik hinter mir und das Tetris Projekt war auch mein erstes "Game" Projekt.
Der Code ist vermutlich super schlecht, habe noch unglaublich viel zu lernen.

EDIT: achso, und einige Klassen sind vollständig auskommentiert, weil die nicht mehr genutzt werden sollen, ich aber trotzdem noch sehen können möchte wie diese Klassen aussehen.
 
Zuletzt bearbeitet:
google mal nach "Konsolenausgabe in Textdatei umleiten java" dann wirst du fündig.



edit: das der sound nicht geht ist klar, da steht ja auch dein lokaler windows pfad drin. ;)
 
Zuletzt bearbeitet:
Wenn Du den Pfad zur Sounddatei hard-codierst, es ist nicht verwunderlich, wenn er auf anderen Rechnern nicht gefunden wird. Die Datei gehört in die Projekt-Resourcen und muss von dort geladen werden (z.B. mittels Class#getResourceAsStream)
 
Ok stimmt, das macht natürlich Sinn.

Ich habe jetzt mal gegooglet um herauszufinden, wie man .mp3 Files in Java abspielen kann.
Und habe diesen Post gefunden bei stackoverflow:
Java FX has Media and MediaPlayer classes which will play mp3 files.

Example code:

String bip = "bip.mp3";
Media hit = new Media(bip);
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();
You will need the following import statements:

import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

Quelle: http://stackoverflow.com/questions/6045384/playing-mp3-and-wav-in-java

Jetzt sieht das bei mir in Eclipse so aus:

j9X4Vco.jpg

Auch wenn ich hier

String bip = "GetLucky8BitNESRemix.mp3";

Den Windows Pfad eingebe, funktioniert es nicht. Da ich das aber im "res" Ordner im Projekt habe, müsste das ja auch ohne Windows Pfad gehen, so wie ich meine Graphiken ja auch ohne Windows Pfad aufrufen konnte, da sie sich im res Ordner befinden.
Wieso funktioniert das also nicht?
 
Weil die Bilder mittels Class#getResource() geladen werden und diese Methode (zufälligerweise) den Pfad korrekt auflöst (Klasse und Datei befinden sich im selben Ordner).

Bei der Sounddatei übergibst Du effektiv den Namen einer Datei (ohne Pfad). Diese wird mit dem aktuellen Verzeichnis aufgelöst. Dort gibt es diese Datei nicht. Verwende deswegen eine JAR URL (mit Hilfe von Class#getResource).
 
soares schrieb:
Weil die Bilder mittels Class#getResource() geladen werden und diese Methode (zufälligerweise) den Pfad korrekt auflöst (Klasse und Datei befinden sich im selben Ordner).

In meinem res Ordner hab ich aber nur image- und soundfiles, keine Klassen.

soares schrieb:
Bei der Sounddatei übergibst Du effektiv den Namen einer Datei (ohne Pfad). Diese wird mit dem aktuellen Verzeichnis aufgelöst. Dort gibt es diese Datei nicht. Verwende deswegen eine JAR URL (mit Hilfe von Class#getResource).

Wie verwende ich denn eine JAR URL? Hab es versucht zu googlen, aber bin daraus nicht schlau geworden.
 
Cinematic schrieb:
In meinem res Ordner hab ich aber nur image- und soundfiles, keine Klassen.

Ah, da war ich unaufmerksam. Bei den Bilders gibst Du an, dass diese im Root-Pfad liegen (durch den Slash). Deswegen funktioniert es hier.



Cinematic schrieb:
Wie verwende ich denn eine JAR URL? Hab es versucht zu googlen, aber bin daraus nicht schlau geworden.

Genau so wie mit den Bildern auch.
 
Also einfach ein Slash hinzufügen?

String bip = "/GetLucky8BitNESRemix.mp3";
Media hit = new Media(bip);
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

Funktioniert nicht. Kommt der gleiche Compilerfehler, wie auf dem Screenshot aus meinem vorletzten Post zu sehen ist.
 
Das ist kein Compiler, sondern ein Runtime-Fehler. Die Methode erwartet einen String, der eine valide URL darstellt.

Was machst Du anders, als bei den Bildern? (Wurde ja praktisch schon genannt).
 
Achja, ich bin doof... ich hab vergessen, dass ich eine Klasse "BufferedImageLoader" habe.
Also wollte ich nun versuchen das genau so zu machen für meine Media Dateien:

package com.game.src.main;

import java.io.IOException;
import javafx.scene.media.Media;

public class SoundFileLoader
{
private Media media;

public Media loadMedia(String path) throws IOException
{
media = MediaIO.read(getClass().getResource(path));
return media;
}

}


Es gibt natürlich kein MediaIO.read(....)

Bei den Bildern hatte ich ja ImageIO.read(....)

Wie lautet also hier die korrekte Syntax?
 
Code:
private void PlaySound(){
     runningHeartSound = true;
     String lowHp = getClass().getResource("/music/ConditionSounds/HeartBeat.mp3").toString();
     Media effect1 = new Media(lowHp);
     MediaPlayer mediaPlayer1 = new MediaPlayer(effect1);
     mediaPlayer1.play();
}

So haben wir es damals gemacht. Hat überall wunderbar funktioniert!
Bei Fragen gerne hier rein schreiben und mir neh kurze PM schreiben, dann Antworte ich eigentlich relativ Schnell!
 
Zuletzt bearbeitet:
laufzeitfehler.JPG

Funktioniert nicht.

Du hast ja irgendwie bei dir den halben Pfad angeben ("/music/ConditionSounds/HeartBeat.mp3")

Der komplette Pfad zu meiner mp3 wäre: C:\Code\Java\Privat\T.Büser\projects\THE GAME\res\GetLucky8BitNESRemix.mp3

Was ich noch versucht habe:
- "/res/GetLucky8BitNESRemix.mp3"
- "/THE GAME/res/GetLucky8BitNESRemix.mp3"

Dann bekomm ich zur Laufzeit aber eine NullPointer Exception.
 
Zurück
Oben