如何从jar包中运行使用maven打包的Clojure应用程序

4

我有以下内容在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个回答

6
您的类路径中没有Clojure Jars。您可以按照Stuart的回复将它们嵌入,或者如果您不喜欢在单个Jar中嵌入所有依赖项,您可以使用Dependency插件和Jar插件来使其正常工作。
请参阅:http://groups.google.com/group/enclojure/msg/87159854fcb0e708 以获取摘要(请注意,链接帖子中有一个拼写错误,包应该称为“foo”)。

4

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


2
如果您正在使用 leiningen,在使用 lein uberjar 生成 jar 文件后,请勿使用 java -jar target/your-name.jar,而是使用 java -jar target/your-name-standalone.jar
对于 boot 也是同样的道理。

-2

所有依赖项都可用吗?我不熟悉clojure.lang.IFn类。它来自外部库吗?如果是,您是否使用提供的范围标记了依赖项?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接