Zum Inhalt springen

JAR, Manifest, Classpath & Co.


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben (bearbeitet)

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
Geschrieben

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

Geschrieben

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)

Geschrieben

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

Geschrieben

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.

Geschrieben (bearbeitet)

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
Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...