如何从jar运行maven包装的clojure应用程序

时间:2010-10-13 20:17:50

标签: java jar clojure maven

我在src/main/clojure/za/co/pb/maven_test/test.clj文件中有以下内容:

(ns za.co.pb.maven-test.test
  (:gen-class))

(defn -main []
  (println "Hello world!"))

我还有一个POM,它在编译执行时对clojure-maven-plugin有必要的依赖。

如果我执行mvn package命令,我会得到一个target/maven-test-1.0-SNAPSHOT.jar文件,如果我查看classes文件夹,我会将这些文件放在target/classes/za/co/pb/maven_test文件夹中:

  • test.class
  • test.clj
  • test__init.class
  • test$loading__4410__auto__.class
  • test$_main.class

据我所知,这是恰当的。

但是,当我运行此命令时:

java -cp target\app-1.0-SNAPSHOT.jar za.co.pb.maven_test.test

我明白了:

Exception in thread "main" java.lang.NoClassDefFoundError: clojure/lang/IFn
Caused by: java.lang.ClassNotFoundException: clojure.lang.IFn
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: za.co.pb.maven_test.test. Program will exit.

4 个答案:

答案 0 :(得分:6)

你在类路径中没有clojure jar。您可以根据Stuart的响应嵌入它们,或者如果您不喜欢将所有依赖项嵌入到单个jar中,您可以使用依赖插件和jar插件来使其正常工作。

请参阅:http://groups.google.com/group/enclojure/msg/87159854fcb0e708获取摘要(注意,链接帖子中有拼写错误,该包名称应为“foo”)。

答案 1 :(得分:4)

您需要生成一个包含项目所有依赖项的JAR文件。 Maven Assembly Plugin使用内置的jar-with-dependencies描述符为您完成此任务。

答案 2 :(得分:2)

如果您使用leiningen,在使用lein uberjar生成jar后,请不要使用java -jar target/your-name.jar,而是使用java -jar target/your-name-standalone.jar

boot也是如此。

答案 3 :(得分:-2)

所有依赖项都可用吗?我不熟悉clojure.lang.IFn类。它来自外部图书馆吗?如果是,你用提供的范围标记了依赖关系吗?