webentwicklung-frage-antwort-db.com.de

Führen Sie die JAR-Datei mit mehreren Klassenpfadbibliotheken an der Eingabeaufforderung aus

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 Client-Computer (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 führe ich dieses Projekt über die Eingabeaufforderung des Clients aus? Ich habe versucht, Java -cp lib\*.jar -jar myproject.jar Aus dem Ordner C:\xyz Zu verwenden, aber es wird folgender Fehler 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 in classpath spezifiziere (wie Java -cp lib\dep1.jar;dep2.jar), Wird das Problem behoben, aber ich möchte dies nicht tun, da ich bereits 40 Bibliotheken habe und es in zukünftigen Releases möglicherweise größer wird. Gibt es einen besseren Weg, dies zu tun?

53
Praneeth

Lassen Sie maven eine Batch-Datei generieren, um Ihre Anwendung zu starten. Dies ist der einfachste Weg dazu.

Sie können das Appassembler-Maven-Plugin für solche Zwecke verwenden.

15
khmarbaise

Sie können nicht sowohl -jar Als auch -cp In der Befehlszeile verwenden - siehe die Java Dokumentation besagt, dass wenn Sie -jar:

die JAR-Datei ist die Quelle aller Benutzerklassen, und andere Benutzerklassenpfadeinstellungen werden ignoriert.

Sie könnten so etwas tun:

Java -cp lib\*.jar;. myproject.MainClass

Beachten Sie das ;. Im Argument -cp, Um einen Java= Befehlszeilenfehler zu umgehen. Beachten Sie auch, dass dies die Windows-Version des Befehls ist Das Pfadtrennzeichen unter Unix ist :.

63
Sualeh Fatehi

Verwenden von Java 1.7 unter UNIX -

Java -cp myjar.jar:lib/*:. mypackage.MyClass

Unter Windows müssen Sie ';' anstatt ':' -

Java -cp myjar.jar;lib/*;. mypackage.MyClass
50
jamp

Unabhängig vom Betriebssystem sollte der folgende Befehl funktionieren:

Java -cp "MyJar.jar;lib/*" com.mainClass

Verwenden Sie immer Anführungszeichen und beachten Sie, dass lib/*. Jar nicht funktioniert.

4
Hari

Sie können das maven-Assembly-Plugin verwenden. Hier ist das Beispiel von der offiziellen Website: https://maven.Apache.org/plugins/maven-Assembly-plugin/usage.html

    <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-Assembly-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>your main class</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-Assembly</id> <!-- this is used for inheritance merges -->
                <phase>package</phase> <!-- bind to the packaging phase -->
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
3
lbsweek

eine mögliche lösung könnte sein

erstellen Sie eine Batch-Datei

es gibt eine Schleife im lib-Verzeichnis für alle darin enthaltenen Dateien und setzt jede dateiunabhängige lib auf classpath

danach den Krug rennen

source für Schleife in Batch-Datei für Informationen zu Schleifen

2
Mukul Goel

Es gibt verschiedene Möglichkeiten.

Am einfachsten ist wahrscheinlich das exec-Plugin .

Sie können mit dem Assembly-Plugin auch eine JAR generieren, die alle Abhängigkeiten enthält.

Zuletzt können Sie eine Datei mit dem Klassenpfad darin erzeugen, indem Sie dependency:classpath Tor.

1
Dave Newton

Ich hatte das gleiche Problem, konnte aber alle Abhängigkeiten mit dem Maven Shade Plugin in meine JAR-Datei packen

1
fjxx