题
这是后续 这个问题.
运行“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
解决了问题。
解决方案
如果您使用的是 Leiningen 1.2,您可能会遇到一个错误,即依赖项会在创建 uberjar 之前被删除(显然违背了 uberjar 的目的)。请降级到 1.1 并等待新版本(应该很快就会发布)或使用 lein 的 HEAD 进行检查(如 lein 的 README 中有关破解 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 清单中指定的类路径(如果有)。