Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi liebe Fachinformatiker-Community.

Ich bin zur Zeit damit beschäftigt aus einem Java-Projekt eine Executable zu erstellen. Allerdings stoße ich dabei auf große Probleme.

Das Projekt war ein Schulprojekt, wurde von uns vorgestellt und jetzt sollen wir das Projekt noch "startbar" abliefern. Das Problem dabei ist, wir haben anstatt der Standard-Schul-IDE Netbeans verwendet aus diversen Gründen und nun ist natürlich niemand fähig das Projekt in Netbeans zu begutachten, wäre ja viel zu kompliziert.

Folglich -> Jar-File / EXE o.Ä. .

Im Detail:

  • Das Projekt basiert auf der LWJGL-Library, also OpenGL.

  • Projekt liegt in D:\Snake, darin der src, dist, build-Ordner etc.

  • LWJGL liegt in D:\LWJGL

  • In Netbeans ist bei Projekt -> Eigenschaften -> Ausführen eingetragen: -Djava.library.path=C:\LWJGL/native/windows

  • main-Funktion liegt in Graphics.Main, Manifest in D:\Snake mit Main-Class: Graphics.Main

Wie müsste jetzt die Aufrufsequenz für das Projekt sein?

Mein jetziger Ansatz:

java -jar -cp %CLASSPATH%;D:\LWJGL\jar\lwjgl.jar;D:\LWJGL\jar\lwjgl_util.jar;D:\Snake -Djava.library.path=D:\LWJGL\native\windows D:\Snake\dist\SnakeOnline.jar
  • -jar da ich ein jar-File starten will
  • -cp der Classpath aus den Umgebungsvariablen + Zwei von LWJGL benötigte Libraries als jar( Wie in Netbeans ) + der Projektordner
  • -Djava... das ist in Netbeans bei Ausführen drin
  • Und am Schluss der Pfad zum Jar-File
Was fehlt jetzt hier noch? Der Fehler den ich bekomme:
java.lang.NoClassDefFoundError in org/lwjgl/opengl/display

Könnte mir bitte jemand sagen was ich falsch mache, was noch fehlt und wie ich es zum Laufen bringe? Ihr wärt echt meine Helden, wenn ihr das hinbringt.

Wenn ihr mehr Informationen braucht, sagt es einfach.

MfG RikuXan

In D:\LWJGL\jar\lwjgl.jar soweit ich weiß, dort sind die ganzen Standardklassen der Library vertreten.

Die stand ja auch schon mit dabei.

MfG RikuXan

Erstelle eine Jar von Deinem Projekt ohne externe Libraries. Du musst beim Jar Aufruf dann eben dafür Sorge tragen, dass eben in den CLASSPATH die notwendigen externen Libs mit aufgenommen werden, den CLASSPATH kann man eben systemweit oder userbezogen passend setzen

Ich bin leider gerade nicht zu Hause um es auszuprobieren, vielen Dank schonmal für die Antworten. Das Manifest ist das normal generierte mit einer Extrazeile

Main-Class: Graphics.Main

Classpath ist im Moment nur irgendetwas von QT drin.

Und das Testprogramm funktioniert auch einwandfrei.

MfG RikuXan

Bearbeitet von RikuXan

So wieder zu Hause hier die genauen Infos:

Manifest.mf:

Manifest-Version: 1.0

X-COMMENT: Main-Class will be added automatically by build

Main-Class: Graphics.Main

Build ohne Libraries: Dann bekommen ich aber von Netbeans beim builden Fehler, da er die Libraries nicht findet. Und noch etwas: Wenn ich das Jar-File in den LWJGL-Ordner kopiere und dann den Testbefehl von LWJGL eingebe, kommt das Testprogramm, wenn ich aber dann den Befehl auf mein Projekt ändere:
java -cp .;res;jar\lwjgl.jar;jar\lwjgl_test.jar;jar\lwjgl_util.jar;jar\lwjgl_fmod3.jar;jar\lwjgl_devil.jar;jar\jinput.jar; -Djava.library.path=native\windows -jar SnakeOnline.jar

Wieder der selbe Fehler:

fehlerk.png

Die Libraries sollten aber stimmen, das Testprojekt findet sie ja auch :/

Wenn auch noch was einfällt, sagt es einfach.

MfG RikuXan

Also so sehe ich direkt keinen Fehler (jedenfalls von dem Aufruf her).

Mach mal bitte folgendes: Erstelle einmal kein Jar File, sondern starte Deine Main-Klasse aus der Konsole mit den passenden CLASSPATH Angaben.

So wie die Meldung es besagt findet er die Klassen des LWJGL's nicht (oder es ist ein Programmierfehler)

Hmm, irgendwie bin ich zu blöd das Projekt so auszuführen, es liegt kompiliert in D:\test\build\classes

Wenn ich es nun aus D:\test aufrufe mit:

java -cp .;res;jar\lwjgl.jar;jar\lwjgl_test.jar;jar\lwjgl_util.jar;jar\lwjgl_fmod3.jar;jar\lwjgl_devil.jar;jar\jinput.jar; -Djava.library.path=native\windows build\classes\Graphics\Main

Die main-Funktion befindet sich in Graphics.Main

Dann bekomme ich den Fehler hier:

fehler2l.png

Sorry, aber Schuljava deckt Details wie Build aus der Kommandozeile etc. leider nicht ab, hoffe ihr verzeiht mir das.

MfG RikuXan

Verwende bitte die Uploadfunktion des Forums

Sorry, aber Schuljava deckt Details wie Build aus der Kommandozeile etc. leider nicht ab, hoffe ihr verzeiht mir das.

Bitte das einmal nacharbeiten, dann sollte es auch kein Problem sein Dein Projekt lauffähig zu bekommen. Der Syntax ist allgemein:


java <deine Klasse>

Wobei Du ggf noch den Packagenamen passend ergänzen musst. Ein Package wird wie ein Verzeichnis behandelt. D.h. wenn Deine Main-Methode in der Klasse "Main" Steckt und das im Package X ist, dann musst Du überhalb des Verzeichnisses X stehen und dort dann "java x/Main" aufrufen.

Sorry mit der Uploadfunktion, war mir bis jetzt noch nicht bewusst, vielen Dank.

Damit, dass das in der Schule nicht abgedeckt wird, meine ich eigentlich eher, dass ich mich dort nicht hundertprozentig auskenne, aber wie auf dem Bild ja auch zu sehen ist rufe ich "build\classes\Graphics\Main" auf.

Die Ordnerstruktur ist in etwa:

D:

test <- hier befinde ich mich

build

classes

Graphics

Main.class

Display.class

GameLogic

jar

lwjgl.jar

Also sollte der Aufruf doch eigentlich auch stimmen, oder?

Was ich nicht genau weiß ist, ob da nicht irgendwo ein foreslash, oder punkt anstatt eines backslashes hinmuss oder ähnliches, da ich sonst eigentlich nichts logisch falsches sehe.

MfG RikuXan

Nebenbei: Vielen dank für deine aktive Hilfe flashpixx, find ich toll, dass es Leute gibt, die sich so für andere engagieren.

Bearbeitet von RikuXan

Damit, dass das in der Schule nicht abgedeckt wird, meine ich eigentlich eher, dass ich mich dort nicht hundertprozentig auskenne, aber wie auf dem Bild ja auch zu sehen ist rufe ich "build\classes\Graphics\Main" auf.

Ich gehe davon aus, dass das nicht korrekt ist. Du musst über dem Verzeichnisses Deiner Packages stehen. D.h. Wenn die Klasse in der die main drin ist als Packagebezeichnung "package Graphics" hat, dann musst Du überhalb von "graphics" stehen.

Außerdem empfehle ich ganz dringend den Konventionen zur Namensgebung von Packages etc folge zu tragen.

Okay ich werd in Zukunft darauf achten, dass die Packages richtig benannt sind( du meinst so etwas wie de.snake.graphics? )

Ich bin ja in test ( D:\test ) und Main.class ist in Graphics ( D:\test\build\classes\Graphics ), bin also überhalb des Ordners.

Könnte ich dir das Projekt vielleicht schicken zusammen mit den Libraries und du schaust ob es bei dir funktioniert? Natürlich nur wenn du Zeit und Lust hast.

MfG RikuXan

Du musst die java-exe sozusagen aus dem Package-Root ausrufen.

Verzeichnisstruktur:

D:

 -> Test

    -> build

       -> classes

          -> de

             -> test

               -> MeineKlasse

Aufruf

d:

cd Test\build\classes

java de.test.MeineKlasse

de.test.MeineKlasse wird dann "umgewandelt" und der Aufruf findet in de/test/MeineKlasse statt.

Trotzdem sind die Punkte wichtig. Mit "/" o.ä. funktioniert es nicht (!).

Wenn -cp oder -classpath verwendet wird dann wird der Wert der Umgebungsvariable CLASSPATH nicht (!) verwendet.

Bei der Verwendung von -jar wird der "User-Classpath" ebenfalls ignoriert (!).

Die sinnvollste Lösung ist wohl den Classpath innerhalb der MANIFEST-Datei denes Jar-Files zu referenzieren.

Struktur:

1. mein-jar-mit-main.jar

2. lib/tools1.jar

3. lib/tools2.jar

Manifest wäre dann

Mainclass....

Class-Path: lib/tools1.jar lib/tools2.jar

"Root" ist immer der Ort an dem die Jar liegt welche aufgerufen wird.

Gruß Sebastian

So, um das ganze abzuschließen und anderen mit dem selben Problem eine kurze Zusammenfassung zu geben:

Meine Probleme waren, wie sich jetzt herausgestellt hat ( durch flashpixx's Hilfe in ICQ ), dass ich versucht habe erstens als ich es mit einem JAR-File versucht habe den Classpath mit anzugeben, was wie Sebastian nochmal erklärt hat nicht funktioniert und zweitens, dass ich nicht versucht habe das kompilierte Projekt aus dem root-Directory aufzurufen, sondern von "weiter oben".

Ergo:

Classpath bei JAR-Files im Manifest angeben

Kompiliertes Projekt aus seinem root-Directory aufrufen

MfG RikuXan

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.