LWJGL -> Runnable .jar

tdc

Bekanntes Mitglied
Hi,
ich habe vor einigen Tagen angefangen, mich in LWJGL einzuarbeiten. Jetzt habe ich zur Übung ein kleines Spiel geschrieben und möchte es nun in eine ausführbare .jar exportieren.
Dafür gibt es bei eclipse 3 Optionen (in die .jar packen, in einen Ordner daneben und noch eine dritte), allerdings kommt bei allen 3 Optionen die Fehlermeldung, dass die nativen Dateien nicht gefunden werden.
Ich habe schon im Internet danach gesucht, wie man die nativen Dateien jetzt einfügen muss, aber ich habe keine funktionierende Lösung gefunden.
Mein Ziel wäre es, am Ende eine ausführbare .jar-Datei zu haben.
Aber wie macht man das am besten? Und wie muss man die nativen Dateien einbinden?

mfg tdc
 

tdc

Bekanntes Mitglied
Also wenn ich die Linux-Natives in die lwjgl.jar (die sich in meiner erzeugten .jar befindet) direkt reinkopiere, kommt immer noch die gleiche Fehlermeldung:

Code:
Exception in thread "main" java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Caused by: java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
	at java.lang.Runtime.loadLibrary0(Runtime.java:823)
	at java.lang.System.loadLibrary(System.java:1028)
	at org.lwjgl.Sys$1.run(Sys.java:73)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
	at org.lwjgl.Sys.loadLibrary(Sys.java:82)
	at org.lwjgl.Sys.<clinit>(Sys.java:99)
	at org.lwjgl.opengl.Display.<clinit>(Display.java:130)
	at game.Game.start(Game.java:46)
	at game.Start.main(Start.java:11)
	... 5 more


Das:
Code:
Caused by: java.lang.UnsatisfiedLinkError: no lwjgl in java.library.path
scheint ja der Grund zu sein. Aber wie bekomme ich die lwjgl-libs zu java.library.path? Muss ich das automatisch beim Programmstart dorthin kopieren?
 
Wenn Du Dein Spiel in Eclipse startest, musst Du ja den Ordner mit den Natives als "working directory" setzen. Kannst das nicht auch im Manifest machen?

EDIT: Achtung, das lwjgl.jar enthält die natives NICHT.
 

tdc

Bekanntes Mitglied
Das Problem ist nicht das Ausführen in Eclipse, das funktioniert einwandfrei, sondern das Exportieren. Die Fehlermeldung oben erhalte ich, wenn ich die exportierte .jar-Datei über die Konsole starte.

Du hast noch das Manifest erwähnt. Eigentlich dürfte es da kein Problem geben, denn das Manifest in der .jar-Datei (/META-INF/MANIFEST.MF) sieht folgendermaßen aus:
Code:
Manifest-Version: 1.0

Rsrc-Class-Path: ./ lwjgl.jar lwjgl_util.jar

Class-Path: .

Rsrc-Main-Class: game.Start

Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Dort sind ja bereits lwjgl.jar und lwjgl_util.jar erwähnt.
 

Kr0e

Gesperrter Benutzer
Bau dir einen Extraktor der aus der internen Jar die native Libraries je nach Betriebsystem in den Ausführungsordner kopiert.
Ist sogar einfacher als es sich anhört... Machen alle guten Engines so...
 
S

Spacerat

Gast
Also die natives gehören definitiv nicht ins Jar-Archiv. Ein vorläufig guter Platz dafür ist das Verzeichnis aus welchem man das Archiv starten will. Zum Starten benötigt man nun allerdings eine Batch-Datei bzw. ein Shellscript. Dieses hat die Aufgabe der JVM das aktuelle Verzeichnis dem "java.library.path" hinzuzufügen.

für Windows: java -Djava.library.path=.;%PATH% -jar myJar.jar

für Linux geht's ähnlich, aber mir ist grad' die Path-Variable nicht geläufig.

Will man die lwjgl-Jars auch mit publizieren muss so noch mit "java.ext.dirs" verfahren werden.
 
Zuletzt bearbeitet von einem Moderator:

Cottonwood

Aktives Mitglied
Ich seh's einfach so, dass sich ein .jar mit Doppelklick starten lassen sollte. Ohne Rücksicht darauf, in welchem Verzeichnis ich mich gerade befinde.

Und wenn das aus irgend welchen Gründen nicht direkt möglich ist, dann sollte man sich dafür ein Setup bauen, mit dem der Desktop Icon mit den erforderlichen Parametern versorgt wird. Ich verwende dafür Inno-Setup.
 
S

Spacerat

Gast
@Cottonwood: Sicher ist das eleganter und auch professioneller. Aber bevor man so etwas macht, sollte man seine Software zumindest einmal ohne Eclipse oder sonst einer IDE zumindest einmal gestartet bekommen und ggf. ausgiebig testen, bevor man immer wieder eine Setup-Exe o.Ä. erstellt, feststellt, dass es immer noch nicht läuft und wieder von vorne anfängt. Da ist das Editieren eines Shell-Scriptes doch zunächst angenehmer oder seh' ich das falsch? Im übrigen lassen sich diese Pfade auch noch zur Laufzeit in der Main-Methode ändern, aber dann müsste man in Eclipse ewig das Jar neu erstellen und es hätte den selben Effekt wie der mit dem Setup.
 
Zuletzt bearbeitet von einem Moderator:

Cottonwood

Aktives Mitglied
Sicher ist das eleganter und auch professioneller. Aber bevor man so etwas macht, sollte man seine Software zumindest einmal ohne Eclipse oder sonst einer IDE zumindest einmal gestartet bekommen und ggf. ausgiebig testen, bevor man immer wieder eine Setup-Exe o.Ä. erstellt, feststellt, dass es immer noch nicht läuft und wieder von vorne anfängt. Da ist das Editieren eines Shell-Scriptes doch zunächst angenehmer oder seh' ich das falsch?

Das Setup erstellt man auch nur einmal.

Im übrigen lassen sich diese Pfade auch noch zur Laufzeit in der Main-Methode ändern, aber dann müsste man in Eclipse ewig das Jar neu erstellen und es hätte den selben Effekt wie der mit dem Setup.

Das ist wohl weniger trivial. Man kann sie zwar setzen, aber das wirkt sich nicht aus.
Wenn es dir gelungen ist, solltest du das mal ganz detailliert beschreiben.
 
S

Spacerat

Gast
@Cottonwood: Aber gerne ;)
Java:
public final class Distributable
{
	public static void main(String[] args)
	{
		try {
			System.loadLibrary("jogl");
			System.out.println("jogl found in java.library.path");
		} catch(Throwable e) {
			System.out.println("jogl not found in java.library.path");
		}
		AccessController.doPrivileged(new PrivilegedAction<Void>()
		{
			public Void run()
			{
				try {
					Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths");
					usrPathsField.setAccessible(true);
					String[] user_paths = (String[]) usrPathsField.get(null);
					String[] new_user_paths = new String[user_paths.length + 1];
					System.arraycopy(user_paths, 0, new_user_paths, 0, user_paths.length);
					new_user_paths[user_paths.length] = new File("").getAbsoluteFile().toString() + File.separator;
					usrPathsField.set(null, new_user_paths);
					usrPathsField.setAccessible(false);
					System.out.println("System ok");
				} catch(Throwable e) {
					System.out.println("System ****ed");
				}
				return null;
			}
		});
		try {
			System.loadLibrary("jogl");
			System.out.println("jogl found in java.library.path");
		} catch(Throwable e) {
			System.out.println("jogl not found in java.library.path");
			e.printStackTrace();
		}
	}
}
Sofern sich eine ladbare (32/64Bit beachten ;)) jogl.dll bzw. .so mit all ihren Abhängigkeiten im Verzeichnis des Jar-Archivs befindet, erhält man folgende Ausgabe:
Code:
jogl not found in java.library.path
System ok
jogl found in java.library.path
Okay... des funzt so jetzt scheinbar nur in der Konsole aber ich kann euch versichern, dass es auch mit GUIs per Doppelklick auf das Jar-Archiv geht ;)

@Edit: Auf Anhieb hab' ich nun auch eine Idee, wie man seine DLLs mit ins Jar-Archiv packen kann. Mit getResource() die URL besorgen, als Datei laden, in ein temporäres Verzeichnis kopieren und dieses wie oben dem "java.library.path" hinzufügen. ;)

@Edit2: Also ich bin nun ehrlich gesagt ein wenig verwirrt. Nach einem Update der JVM zeigt die Ausgabe in beiden Fällen (vor und nach diesem äh nennen wir es Patch) an, dass die Bibliothek gefunden wurde. Heisst das, dass das aktuelle Verzeichnis erst vor kurzem dem Standard-Suchpfad der JVM hinzugefügt wurde? Naja... zumindest lassen sich auf die Art auch noch weitere Verzeichnisse, diesem Suchpfad anhängen, z.B. die Trennung von 32- und 64 Bit.
 
Zuletzt bearbeitet von einem Moderator:

tdc

Bekanntes Mitglied
Danke für die vielen Antworten!

Ich habs jetzt erstmal mit nem Shell-Script gelöst.

Code:
export LD_LIBRARY_PATH=PFAD/native/linux/
cd PFAD
java -jar JARNAME.jar
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
coolian lwjgl glfw window zeigt nur grau an Spiele- und Multimedia-Programmierung 0
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
F OpenGL (LWJGL) Shader Programmierung GLSL Spiele- und Multimedia-Programmierung 2
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
V LWJGL GUI Spiele- und Multimedia-Programmierung 1
V GUI in LWJGL 2 erstellen Spiele- und Multimedia-Programmierung 6
C GLSL Shaderprogrammierung in LWJGL 3 Spiele- und Multimedia-Programmierung 12
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
B LWJGL OpenGL SIGSEGV auf Linux (Verzweiflung :/) Spiele- und Multimedia-Programmierung 8
G LWJGL .obj .mtl loader Spiele- und Multimedia-Programmierung 3
G 2D animationen LWJGL Spiele- und Multimedia-Programmierung 0
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
G lwjgl verwendung Spiele- und Multimedia-Programmierung 6
R [LWJGL] Skeletal Animation Spiele- und Multimedia-Programmierung 5
E LWJGL glGenVertexArrays() erzeugt doppelte IDs Spiele- und Multimedia-Programmierung 3
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
K No Lwjgl Spiele- und Multimedia-Programmierung 2
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
T LWJGL: Terrain-Texturen / 2D-Array in Shader? Spiele- und Multimedia-Programmierung 2
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
T [LWJGL] Textur / File wieder freigeben Spiele- und Multimedia-Programmierung 4
F [LWJGL] Skeletal Animation 3D Spiele- und Multimedia-Programmierung 1
C Generelle Hilfe zur lwjgl Spiele- und Multimedia-Programmierung 0
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
RalleYTN LWJGL Vignette Spiele- und Multimedia-Programmierung 2
E LWJGL Switchen zwischen gluOrtho und gluPerspective Spiele- und Multimedia-Programmierung 0
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
C LWJGL Color Picking Textures deaktivieren Spiele- und Multimedia-Programmierung 0
K FBO Framebuffer object [LWJGL] 2D tutorial gesucht Spiele- und Multimedia-Programmierung 2
K [LWJGL] 2D Tunneler Hintergrund Spiele- und Multimedia-Programmierung 7
S LWJGL 3d-spieleentwicklung Spiele- und Multimedia-Programmierung 3
H LWJGL-Renderfail Spiele- und Multimedia-Programmierung 1
Seikuassi LWJGL - Texturen flackern Spiele- und Multimedia-Programmierung 2
Androbin LWJGL - Kollisions-Bug (Fallen) Spiele- und Multimedia-Programmierung 14
K Schiessen in 2D (LWJGL) Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
U Kann nur ein Objekt mit LWJGL rendern Spiele- und Multimedia-Programmierung 2
X LWJGL | Parent.isDisplayable() must be true | wie kann man das zu true machen? Spiele- und Multimedia-Programmierung 0
X [LWJGL] Binden von Texturen per PNG File und Texture Sheet Spiele- und Multimedia-Programmierung 1
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
U Quadrate anklicken LWJGL Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
B LWJGL Manche Seiten werden transparent angezeigt Spiele- und Multimedia-Programmierung 2
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
U Komische fragmente bei LWJGL Spiele- und Multimedia-Programmierung 6
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Q LWJGL - Alpha-Probleme Spiele- und Multimedia-Programmierung 2
S [LWJGL] Zweimal selbe Textur trotz unterschiedlicher IDs Spiele- und Multimedia-Programmierung 3
O LWJGL AWTGLCanvas Tiefe auf 1 beschränkt Spiele- und Multimedia-Programmierung 5
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
S [LWJGL] schwarzer Bildschrim beim rendern von .obj Model Spiele- und Multimedia-Programmierung 2
S [lwjgl] Renderbug bei mehreren Objekten Spiele- und Multimedia-Programmierung 2
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Koordinaten invertiert. Spiele- und Multimedia-Programmierung 2
M LWJGL Text rendern Spiele- und Multimedia-Programmierung 3
B LWJGL Mauskoordinaten Spiele- und Multimedia-Programmierung 1
J LWJGL Update Schleife (Snake) Spiele- und Multimedia-Programmierung 6
B LWJGL Display.update() ist langsam Spiele- und Multimedia-Programmierung 5
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
R LWJGL: Object Loader -> .obj, .c4d, ... laden Spiele- und Multimedia-Programmierung 3
R LWJGL: Textur -> unsichtbare Stellen, wie erzeugen? Spiele- und Multimedia-Programmierung 4
A LwJGL - Animation Stockt Spiele- und Multimedia-Programmierung 5
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
R LWJGL: 3D Picking Spiele- und Multimedia-Programmierung 4
F LWJGL: Textur ändern mit GL11.readPixels Spiele- und Multimedia-Programmierung 5
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
F LWJGL: Is undefined? Spiele- und Multimedia-Programmierung 7
F LWJGL Kamerabug Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
F LWJGL Dreidimensionaler Würfel Spiele- und Multimedia-Programmierung 15
P LWJGL oder OpenGL (C++) Spiele- und Multimedia-Programmierung 7
P "Tiefe" in Objekten - LWJGL Spiele- und Multimedia-Programmierung 12
T LWJGL 3D Objekt Collision: Wie? Spiele- und Multimedia-Programmierung 11
S LWJGL Kamera Frage Spiele- und Multimedia-Programmierung 2
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
Z lwjgl oder jogl nutzen Spiele- und Multimedia-Programmierung 9
Y LWJGL Hintergrund Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Textur wird falsch angezeigt Spiele- und Multimedia-Programmierung 12
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
F lwjgl - Skysphere Spiele- und Multimedia-Programmierung 3
CookieSoft Slick und LWJGL Texture lag Spiele- und Multimedia-Programmierung 13
U OpenGl 1.1 (LWJGL GL11.*) und weiter? Spiele- und Multimedia-Programmierung 7
0 Grafikfehler LWJGL Spiele- und Multimedia-Programmierung 2
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
Luk10 (LWJGL) Aufwendiges Animieren von Texturen Spiele- und Multimedia-Programmierung 16
S (LWJGL) VertexBufferObjects Spiele- und Multimedia-Programmierung 20
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
H LWJGL: Fragen zum Verständnis Spiele- und Multimedia-Programmierung 7
T LWJGL Gui erstellen Spiele- und Multimedia-Programmierung 7
Kenan89 lwjgl Exception Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben