Ich habe ein Maven-Projekt, das eine jar-Datei generiert und alle Abhängigkeiten in den Ordner target/lib
kopiert. Ich möchte dieses Projekt auf dem Rechner des Kunden (Windows) ausführen. Also habe ich "myproject.jar" in den Ordner "C:\xyz" und alle Abhängigkeiten in den Ordner "C:\xyz/lib" kopiert. Wie kann ich dieses Projekt von der Eingabeaufforderung des Clients aus ausführen?
Ich habe versucht, java -cp lib\*.jar -jar myproject.jar
aus dem Ordner C:\xyz
zu verwenden, aber es wird folgende Fehlermeldung ausgegeben.
Exception in thread "main" java.lang.NoClassDefFoundError: lib\commons-codec-1/3/jar
Caused by: java.lang.ClassNotFoundException: lib\commons-codec-1.3.jar
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: lib\commons-codec-1.3.jar. Program will exit.
Ich denke, wenn ich alle Abhängigkeiten im Klassenpfad angebe (z.B. java -cp lib\dep1.jar;dep2.jar
), wird das Problem behoben, aber ich möchte das nicht tun, da ich bereits 40 Bibliotheken habe und diese Zahl in zukünftigen Versionen noch steigen könnte. Gibt es eine bessere Möglichkeit, dies zu tun?
eine mögliche Lösung könnte sein
eine Batch-Datei erstellen
dort eine Schleife über das lib-Verzeichnis für alle darin enthaltenen Dateien durchführen und jede Datei außerhalb von lib auf den Klassenpfad setzen
Danach führen Sie das Jar aus
Quelle for loop in batch file für Informationen über Schleifen
Es gibt mehrere Möglichkeiten.
Die einfachste ist wahrscheinlich das exec-Plugin.
Sie können auch mit dem assembly plugin ein jar erzeugen, das alle Abhängigkeiten enthält.
Schließlich können Sie eine Datei mit dem Klassenpfad erzeugen, indem Sie das Ziel dependency:classpath
verwenden.
Dies wird nicht funktionieren java -cp lib\*.jar -jar myproject.jar
. Sie müssen es jar für jar einsetzen.
Also im Fall von commons-codec-1.3.jar
.
java -cp lib/commons-codec-1.3.jar;lib/next_jar.jar` und so weiter.
Die andere Lösung könnte sein, alle Jars in das ext
-Verzeichnis Ihrer JRE zu legen. Dies ist in Ordnung, wenn Sie eine eigenständige JRE verwenden. Wenn Sie dieselbe JRE für mehr als eine Anwendung verwenden, empfehle ich dies nicht.