Ausführen einer ausführbaren jar-ClassNotFoundException werfen
Den Verzeichnissen, die in meinem jar-Dateien sind wie diese:
in remote.jar
-com
-lib
-META-INF
unter META-INF
ist die Datei MANIFEST.MF
:
Manifest-Version: 1.0
Class-Path: lib/*
Main-Class: com.xx.xx.Main
und alle Gläser sind unter lib
Ordner.
Aus der command-line wenn ich java -jar remote.jar
es gibt mir ClassNotFoundException
die Klasse nicht gefunden, wird in einem der Gläser unter lib
Ordner. Wenn die main
Funktion nicht auf jede Klasse in der lib, die Befehlszeile ausführen, kein problem.
Meine Frage ist, warum es nicht finden können, die Klassen in jars unter lib.
EDIT:
Keine verschachtelten Ordner unter Ordner lib
- möglich, Duplikat der java.lang.ClassNotFoundException beim ausführen von java-jar (immer noch ungelöste)
- auf einer seitlichen Anmerkung: dein Titel ist falsch
- Ändern Sie den Klassenpfad für die zu
./lib/
- nicht Arbeit, die ich versuchte.
- Ich habe erfolgreich erstellt eine ausführbare jar-Datei verweisen auf Drittanbieter-jars über export in Eclipse. Eclipse dann behandelt die Erstellung des MANIFESTS.MF für mich und fügte hinzu, die notwendigen Sachen zu laden jars in einem jar.
- Sorry, dass ich IDEE
- Ah. Ich habe nie IDEE, aber gerade diese link, die Ihnen helfen könnten, aus.
- genau den link gefolgt, die Sie veröffentlichen, und erstellen Sie das Glas, aber nicht laufen kann
- Entschuldigung. Dieser link ist nur für die Erstellung einer normalen jar, nicht eine ausführbare Datei ein. Leider konnte ich nicht herausfinden, wie das zu erreichen ist in IntelliJ IDEA. Vielleicht wird es einfacher mit Eclipse, aber das ist ein bisschen Schmerz nur um eine runnable jar.
- Ich verstehe, trotzdem danke.
- Bitte schauen Sie sich
One-Jar
aus meiner Antwort. Ich habe nicht verwendet es nicht persönlich, aber ich habe gelesen, dass viele Leute empfehlen, es zu schaffen, eine einzige ausführbare jar-Datei. Ansonsten könnten Sie überprüfen, stackoverflow.com/questions/2025607 , aber ich bin nicht sicher, es ist über ausführbare jars entweder. - Ja, ich habe versucht, in meinem ersten Versuch ist die Nutzung von One-Jar und es funktioniert ganz gut, aber ich kann nicht es nehmen, weil es bauen alle Abhängigkeiten in eine jar-Datei, die so groß ist, dass in meinem Projekt, so habe ich, um eine kundenspezifische version erstellen, mit mehreren Klasse und ein paar benutzte Gläser.
- Ich bin ziemlich sicher, dass Man-Glas können Sie konfigurieren, welche Gläser zu packen und die bleiben, wie die Laufzeit-Abhängigkeit (ist es das, was Sie wollen ?) Auch, konnten Sie mit einer Beute in Proguard. Es kann zu extrahieren und pack zu bestimmten Klassen, nicht ganz, Gläser.
- Verwenden Sie Maven ? Es wird Ihnen helfen, Ihre Abhängigkeiten, wie Sie das möchten.
- Vielen Dank für Ihre Antwort, ja ich benutze maven, ich ging auch um zu sehen, doc für one-jar aber leider noch keine Informationen über "die Gläser zu packen und die bleiben, wie die Laufzeit-Abhängigkeit".
- Ich denke, du bist Recht über die mangelnde Flexibilität von One-Jar. Lassen Sie uns versuchen, um es zu packen mit maven dann. Schau mal hier : stackoverflow.com/questions/16222748
- für die Frage zu, obwohl es scheint ein ziemlich verbreitetes problem, habe ich etwas neues gelernt heute.
- danke, ich habe gerade versucht JarSplice Sie sagte, es fast arbeiten, scheitern aber am letzten Schritt, Sie sagte, ich habe dupliziert Klasse in einem Glas, ohne das Glas könnte es bauen, aber Sie wissen, nicht finden können, in der Klasse, wenn nötig, zu laufen. Ich versuche Proguard...
- lassen Sie uns weiter, diese Diskussion im chat
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass die Class-Path-Eigenschaft, die im manifest nicht funktioniert, wie Sie denken, es tut. Sehen http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
Die einfachste Lösung ist, lassen Sie die classpath-jars außerhalb Ihrer jar und zum erstellen eines kleinen batch-Datei oder shell-Skript zum erstellen der classpath und rufen Sie Ihr Glas.
Ich fürchte Einstellung Ihrer
MANIFEST
Class-path
lassen Sie nicht erfolgreich laden von Klassen ausnested
Gläser (d.h. innerhalb Ihrer jar, wie es in dem link von Ian ' s Antwort).Wenn Sie möchten, um Paket einzelne ausführbare jar-Datei, Ihre besten Optionen wären :
not JAR files within the JAR file or classes accessible over internet protocol