14

这是这个问题的后续。

运行“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'

,我收到以下错误。

引起:java.lang.ClassNotFoundException:clojure.lang.IFn
        在 java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        在 java.security.AccessController.doPrivileged(本机方法)
        在 java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        在 java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        在 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

解决问题。

4

1 回答 1

12

如果您使用的是 Leiningen 1.2,您可能会遇到一个错误,即依赖项会在创建 uberjar 之前被删除(显然违背了 uberjar 的观点)。请降级到 1.1 并等待新版本(应该很快就会到来)或使用 lein 的 HEAD 结帐(如 lein 的 README 中关于 hacking Leiningen 的部分所述)。

一旦你这样做了,你应该能够生成一个独立的 jarlein uberjarjava -jar name-of-your-standalone.jar启动你的应用程序。

作为替代方案,您可以创建一个常规 jarlein jar并说出类似的内容java -cp '$PROJECT_ROOT/lib/*:your-app.jar' your-app.mainyour-app.main您的应用程序的主类在哪里;当然,替换$PROJECT_ROOT为适当的路径并提供一个路径your-app.jar)。这个lib/*东西只适用于JDK 1.6;对于 1.5,您必须分别包含每个 jar。请注意,使用-jar,-cp和时$CLASSPATH会被忽略;仅考虑 jar 清单(如果有)中指定的类路径。

于 2010-08-03T21:15:29.747 回答