Как запустить банку из команды 'lein jar'? - PullRequest
13 голосов
/ 04 августа 2010

Это продолжение для этого вопроса .

После запуска lein jar я получаю myproject-1.0.0-SNAPSHOT.jar, который не содержит clojure-1.2.0-beta1.jar и clojure-contrib-1.2.0-beta1.jar.

А запуск lein uberjar дает мне два файла jar.Первый (который заканчивается на -standalone.jar) - это jar, содержащий все, а второй - такой же, как jar, сгенерированный с помощью 'lein jar'.

Это вопрос банки со вторым.Нет проблем с запуском первой банки, как я объяснял в предыдущем посте .

Когда я запускаю

java -cp PATH_TO_THE_CLOJURE_AND_CONTRIB.jar:$CLASSPATH -jar myproject-1.0.0-SNAPSHOT.jar'

, я получаю следующую ошибку.

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)

Что может быть не так, я подумал, что могу использовать 'myproject-1.0.0-SNAPSHOT.jar аналогично 'myproject-1.0.0-SNAPSHOT-standalone.jar', если я указываю на файлы jar с помощью опции -cp.

Что-нибудь еще, что мне пришлось сделать?

ДОБАВЛЕНО

java -cp ALLTHE_JAR_PATH myproject.core

решает проблему.

1 Ответ

10 голосов
/ 04 августа 2010

Если вы используете Leiningen 1.2, вы, вероятно, столкнулись с ошибкой, из-за которой зависимости удалялись до создания uberjar (очевидно, победив точку uberjar). Пожалуйста, вернитесь к версии 1.1 и дождитесь выхода новой версии (которая должна появиться в ближайшее время) или используйте проверку HEAD lein (как описано в разделе о взломе Leiningen в README lein).

Как только вы это сделаете, вы сможете создать автономную банку с lein uberjar и сказать java -jar name-of-your-standalone.jar, чтобы запустить ваше приложение.

В качестве альтернативы вы можете создать обычный jar с lein jar и сказать что-то вроде java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main (где your-app.main - основной класс вашего приложения; также замените $PROJECT_ROOT на соответствующий путь и укажите путь к your-app.jar, конечно). lib/* вещь будет работать только на JDK 1.6; с 1.5 вы должны будете включить каждую банку отдельно. Обратите внимание, что при использовании -jar, -cp и $CLASSPATH игнорируются; учитывается только путь к классу, указанный в манифесте банки (если есть).

...