4 Stimmen

Wie man eine mit Maven gepackte Clojure-Anwendung aus dem Jar ausführt

Ich habe folgende Inhalte in der Datei src/main/clojure/za/co/pb/maven_test/test.clj:

(ns za.co.pb.maven-test.test
  (:gen-class))

(defn -main []
  (println "Hallo Welt!"))

Ich habe auch ein POM, das die notwendigen Abhängigkeiten zum clojure-maven-plugin mit der Ausführung von "compile" enthält.

Wenn ich den Befehl mvn package ausführe, erhalte ich eine Datei namens target/maven-test-1.0-SNAPSHOT.jar und wenn ich in den Klassenordner schaue, habe ich diese Dateien im Ordner target/classes/za/co/pb/maven_test:

  • test.class
  • test.clj
  • test__init.class
  • test$loading__4410__auto__.class
  • test$_main.class

Dies ist meines Wissens nach angemessen.

Wenn ich jedoch diesen Befehl ausführe:

java -cp target\app-1.0-SNAPSHOT.jar za.co.pb.maven_test.test

Erhalte ich dies:

Ausnahme in thread "main" java.lang.NoClassDefFoundError: clojure/lang/IFn
Verursacht durch: java.lang.ClassNotFoundException: clojure.lang.IFn
    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)
Die Hauptklasse za.co.pb.maven_test.test wurde nicht gefunden. Das Programm wird beendet.

6voto

Steve Lindsay Punkte 76

Du hast die Clojure-Jars nicht im Klassenpfad. Du kannst sie entweder wie in Stuarts Antwort eingebettet verwenden, oder wenn du es nicht magst, alle Abhängigkeiten in einem einzigen Jar eingebettet zu haben, kannst du das Abhängigkeits- und Jar-Plugin verwenden, um dies ordnungsgemäß zu ermöglichen.

Siehe: http://groups.google.com/group/enclojure/msg/87159854fcb0e708 für eine Zusammenfassung (Hinweis: Es gibt einen Tippfehler im verlinkten Beitrag; das Paket sollte "foo" heißen).

4voto

Stuart Sierra Punkte 10597

Sie müssen eine JAR-Datei generieren, die alle Abhängigkeiten Ihres Projekts enthält. Das Maven Assembly Plugin erledigt dies für Sie mithilfe des integrierten jar-with-dependencies-Deskriptors.

2voto

nha Punkte 16783

Wenn Sie Leiningen verwenden, verwenden Sie nach dem Generieren des JAR mit lein uberjar nicht java -jar target/your-name.jar, sondern java -jar target/your-name-standalone.jar.

Gleiches gilt für boot.

-2voto

kukudas Punkte 4716

Sind alle Abhängigkeiten verfügbar? Ich bin nicht vertraut mit der clojure.lang.IFn Klasse. Ist sie aus einer externen Bibliothek? Falls ja, haben Sie die Abhängigkeit mit dem bereitgestellten Scope markiert?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X