Wie das Glas aus ‚lein jar‘ Befehl auszuführen?
Frage
Dies ist ein Follow-up diese Frage .
Nach dem Ausführen von 'lein jar', I get 'myproject-1.0.0-SNAPSHOT.jar', die enthält nicht den Clojure-1.2.0-beta1.jar und Clojure-contrib-1.2.0-beta 1. Krug.
Und läuft 'lein uberjar' gibt mir zwei JAR-Dateien. Die erste (die Enden mit -standalone.jar) ist das Glas enthält alles, und das zweite ist das gleiche wie das Glas mit ‚Lein jar‘ erzeugt.
Dies ist die Frage nach der Dose mit dem zweiten. Es gibt kein Problem mit dem ersten Glas läuft, wie ich im vorigen post .
Wenn ich ausführen
java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'
, ich folgende Fehlermeldung erhalten.
Caused by: java.lang.ClassNotFoundException: clojure.lang.IFn at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Was könnte falsch sein, dachte ich, dass ich die ‚myproject-1.0.0-SNAPSHOT.jar die gleiche Art und Weise mit‚myproject-1.0.0-SNAPSHOT-standalone.jar‘verwenden kann, wenn ich auf die JAR-Dateien verweisen mit - cp Option.
Gibt es etwas, dass ich tun?
ADDED
java -cp ALLTHE_JAR_PATH myproject.core
löst das Problem.
Lösung
Wenn Sie mit Leiningen 1.2, sind Sie wahrscheinlich Hit durch einen Fehler ist, wodurch Abhängigkeiten vor der Schaffung eines uberjar gelöscht werden würde (natürlich dem Sieg über den Punkt der uberjar). Bitte entweder Herabstufung auf 1,1 und Warten auf die neue Version (die in Kürze eintreffen soll) oder eine Kasse von lein HEAD verwenden (wie auf Hacking Leiningen in lein README im Abschnitt beschrieben).
Wenn Sie das tun, sollten Sie in der Lage sein, ein Standalone-Glas mit lein uberjar
zu produzieren und sagen java -jar name-of-your-standalone.jar
Ihre App zu starten.
Als Alternative können Sie eine regelmäßige Glas mit lein jar
schaffen und etwas sagen wie java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main
(wo your-app.main
Ihre Anwendung ist Hauptklasse, auch ersetzen $PROJECT_ROOT
mit dem entsprechenden Pfad und liefern einen Pfad zu your-app.jar
, natürlich). Die lib/*
Sache funktioniert nur auf JDK 1.6; mit 1,5 würden Sie jedes Glas einzeln schließen müssen. Beachten Sie, dass, wenn -jar
Verwendung -cp
und $CLASSPATH
ignoriert werden; nur der angegebene Classpath in der der jar-Manifest (falls vorhanden) berücksichtigt wird.