如何运行'lein jar'命令制作的jar?

pro*_*eek 13 clojure leiningen

这是这个问题的后续行动.

运行'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包含所有内容,第二个与使用'lein jar'生成的jar相同.

这是第二个罐子的问题.使用第一个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)

可能有什么问题,如果我使用-cp选项指向jar文件,我认为我可以像'myproject-1.0.0-SNAPSHOT-standalone.jar'一样使用'myproject-1.0.0-SNAPSHOT.jar'.

还有什么我必须做的吗?

添加

java -cp ALLTHE_JAR_PATH myproject.core

解决了这个问题.

Mic*_*zyk 10

如果你正在使用Leiningen 1.2,那么你很可能会遇到一个错误,即在创建一个uberjar之前就会删除依赖关系(显然会击败uberjar).请降级到1.1并等待新版本(应该很快到达)或使用lein的HEAD结帐(如lein的自述文件中关于黑客Leiningen的部分所述).

一旦你这样做,你应该能够制作一个独立的jar,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被忽略; 只考虑jar的清单中指定的类路径(如果有的话).

  • 1.2 bug的另一个解决方法是在project.clj中包含:main命名空间; 如果你正在构建一个uberjar进行分发,你可能还是想要一个-main函数.在此过程中包括AOT可以避免jar清除错误. (2认同)