Ich habe eine JAR-Datei erstellt, die alle meine kompilierten Inhalte enthält. Zusätzlich kopiert mein Ant Build Skript die erforderlichen Bibliotheken in einen Unterordner "libs". Die Struktur sieht folgendermaßen aus:
MyProgram.jar
libs/
Wenn ich jetzt versuche, mein Programm auszuführen, wird folgende Fehlermeldung angezeigt:
java -cp ".:/home/user/java/MyProgram/jar/libs" -jar MyProgram.jar
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at database.PostgresQL.getConnection(PostgresQL.java:38)
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:19)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
java.lang.NullPointerException
at recommender.dao.Creative2IdxDAO.createCreatives2Idx(Creative2IdxDAO.java:25)
at main.Main.calculateCorrelationMatrix(Main.java:51)
at main.Main.main(Main.java:28)
Warum passiert das?
<manifestclasspath>
;
stattdessen Semikolon ( ) verwenden, da unter Windows der Doppelpunkt für Laufwerksbuchstaben verwendet wird. Das OP verwendete in seiner Frage Doppelpunkte und Schrägstriche, was darauf hindeutet, dass sie unter Linux oder Mac ausgeführt werden.Wenn die
-jar
Option verwendet wird, wird die-cp
Option ignoriert. Die einzige Möglichkeit, den Klassenpfad festzulegen, besteht in der Verwendung der Manifestdatei im JAR.Es ist einfacher, einfach die
-cp
Option zu verwenden, Ihre JAR-Datei hinzuzufügen und dann die Hauptklasse explizit aufzurufen.Vorausgesetzt, der
/home/user/java/MyProgram/jar/libs
Ordner enthält JAR-Dateien (im Gegensatz zu Klassendateien), funktioniert dies nicht. Sie können keinen Ordner mit einer JAR-Datei angeben, sondern müssen jede JAR-Datei einzeln im Klassenpfad angeben (es lohnt sich, ein einfaches Shell-Skript zu schreiben, um dies für Sie zu tun, wenn eine erhebliche Anzahl von Jars vorhanden ist).quelle
Es ist ein bisschen schwierig. Das folgende Skript ist ein Versuch, den Klassenpfad aus dem Manifest der JAR-Datei abzurufen und anschließend zusätzliche Klassenpfadeinträge hinzuzufügen. Ich hatte gemischte Ergebnisse damit, möchte das Skript aber trotzdem teilen, damit es hier voll funktionsfähig wird.
Das Skript hat zwei Namen
durch Hardlinking der beiden Dateien zusammen mit
Mit calljar -h können Sie die Verwendung sehen.
quelle
Für schnelle, einmalige Tests einer App können Sie die erforderlichen Abhängigkeits-JAR-Dateien einfach mit dem Verzeichnis verknüpfen, das die Haupt-App-JAR-Datei enthält.
Beispiel (für eine App,
app.jar
die die Eclipse SWT-Bibliothek verwendet, in der in meinem Fall installiert wurde/usr/share/java
):quelle