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

时间:2010-08-03 20:49:10

标签: clojure leiningen

这是this question的后续行动。

运行'lein jar'后,我得到'myproject-1.0.0-SNAPSHOT.jar',它不包含clojure-1.2.0-beta1.jar和clojure-contrib-1.2.0-beta1。罐。

运行'lein uberjar'给了我两个jar文件。第一个(以-standalone.jar结尾)是jar包含所有内容,第二个与使用'lein jar'生成的jar相同。

这是第二个罐子的问题。运行第一个jar没有问题,正如我之前在post中解释的那样。

当我跑步时

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选项。

我还有什么需要做的吗?

ADDED

java -cp ALLTHE_JAR_PATH myproject.core

解决了这个问题。

1 个答案:

答案 0 :(得分:10)

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

一旦你这样做,你应该能够制作一个带有lein uberjar的独立jar并说java -jar name-of-your-standalone.jar来启动你的应用。

作为替代方案,您可以使用lein jar创建一个常规jar,并说出java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.main之类的内容(其中your-app.main是您的应用程序的主类;同样,将$PROJECT_ROOT替换为your-app.jar适当的路径,并提供lib/*的路径,当然)。 -jar这个东西只适用于JDK 1.6; 1.5,你必须分开包括每个罐子。 请注意,使用-cp时,$CLASSPATH和{{1}}会被忽略;只考虑jar的清单中指定的类路径(如果有的话)。