这是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选项。
我还有什么需要做的吗?
java -cp ALLTHE_JAR_PATH myproject.core
解决了这个问题。
答案 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的清单中指定的类路径(如果有的话)。