Comment faire pour exécuter le pot fait de la commande « pot lein »?
Question
Ceci est un suivi de cette question.
Après avoir exécuté 'pot de lein', je reçois 'myproject-SNAPSHOT.jar-1.0.0', qui ne contient pas le clojure-1.2.0-beta1.jar et Clojure-contrib-1.2.0-beta1. pot.
Et en cours d'exécution 'lein uberjar' me donne deux fichiers jar. La première (qui se termine par -standalone.jar) est le pot contient tout, et le deuxième est le même que le pot généré par 'lein pot.
Telle est la question du pot avec le second. Il n'y a aucun problème en cours d'exécution avec le premier pot, comme je l'ai expliqué dans le précédent après .
Quand je lance
java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'
, je reçois l'erreur suivante.
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)
Qu'est-ce qui pourrait être mal, je pensais que je peux utiliser le « myproject-SNAPSHOT.jar-1.0.0 de la même manière avec 'myproject-1.0.0-SNAPSHOT-standalone.jar si je signale aux fichiers JAR à l'aide - option cp.
Y at-il quelque chose de plus que je devais faire?
AJOUTÉE
java -cp ALLTHE_JAR_PATH myproject.core
permet de résoudre le problème.
La solution
Si vous utilisez Leiningen 1.2, vous êtes probablement être touché par un bug dans lequel les dépendances obtiendraient supprimées avant la création d'un uberjar (battant évidemment le point de uberjar). S'il vous plaît revenir à la version 1.1 et attendre la nouvelle version (qui devrait arriver sous peu) ou utiliser une caisse de tête de lein (comme décrit dans la section sur le piratage Leiningen dans le README de lein).
Une fois que vous faites cela, vous devriez être en mesure de produire un pot autonome avec lein uberjar
et dire java -jar name-of-your-standalone.jar
pour lancer votre application.
Comme alternative, vous pouvez créer un pot régulier avec lein jar
et dire quelque chose comme java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main
(où your-app.main
est votre classe principale de l'application, aussi, remplacer $PROJECT_ROOT
par le chemin approprié et fournir un chemin à your-app.jar
, bien sûr). La chose lib/*
ne fonctionne que sur JDK 1.6; avec 1,5 vous auriez à inclure chaque pot séparément. Notez que sont ignorés lors de l'utilisation -jar
, -cp
et $CLASSPATH
; seul le classpath spécifié dans le manifeste du pot (le cas échéant) est pris en compte.