独立的clojure应用程序

时间:2011-07-29 14:02:25

标签: clojure classnotfoundexception leiningen

我是clojure的初学者,昨天才开始。

我认为创建独立应用的一种简单方法是使用leiningen lein new foo

我尝试用leiningen创建一个hello world测试项目。我添加了:main和:aot指令到project.clj,添加:gen-class到core.clj文件并尝试了lein run,但是我发现找不到类定义的错误。

Exception in thread "main" java.lang.NoClassDefFoundError: 
Caused by: java.lang.ClassNotFoundException: 
    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)

core.clj文件

(ns test.core
  (:gen-class))
(defn -main [& args] (println "Hello main"))

和project.clj文件

(defproject test "1.0.0-SNAPSHOT"
  :description "FIXME: write description"
  :main test.core
  :aot [test.core]
  :dependencies [[org.clojure/clojure "1.2.1"]])

编辑:经过进一步测试后,似乎将项目复制到我的桌面工作原理,我认为我的笔记本电脑上的环境不知何故被剔除,但我不知道如何。

桌面上的环境是来自存储库和来自AUR的leiningen的clojure。在笔记本电脑上,clojure来自clojure.org,leining来自github。

4 个答案:

答案 0 :(得分:31)

[2013年4月更新]

Leiningen 2已经正式发布了一段时间,其中包括项目模板的概念。默认情况下,Leiningen提供app模板,提供开箱即用的功能。尝试:

lein new app my-project

您将看到Leiningen创建熟悉的项目模板,但也包括:

  • my-project.core作为:main文件中的project.clj条目的默认命名空间
  • :gen-class
  • 的命名空间声明中的my-project.core表单
  • -main命名空间
  • 中的默认my-project.core函数

对于那些尚未使用Leiningen 2的人来说,lein-newnew插件在Leiningen 1下提供了相同的体验。

<强> [/ UPDATE]

要构建一个项目,在运行时打印“Hello World!”,您将执行以下操作(上述过程的修订版):

设置

lein new my-project
cd my-project
lein deps

你现在应该有lib文件夹中的基本结构和Clojure jar。

编写函数

现在使用您选择的编辑器编辑src/my_project/core.clj,在(ns ...)表单下方添加以下内容:

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

此函数位于my-project.core命名空间内。为了确保将其作为主要内容运行,让我们在顶部的命名空间定义中添加gen-class参数,以便它现在看起来像core.clj的顶部:

(ns my-project.core
  (:gen-class :main true))

总而言之,您的core.clj文件如下所示:

(ns my-project.core
  (:gen-class :main true))

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

将其配置为主要功能

如上所述编辑src/my_project/core.clj后,您需要告诉Leiningen(构建工具)您项目的“主要”功能所在的位置。以下是执行此操作的示例defproject形式:

(defproject my-project "1.0.0-SNAPSHOT"
  :description "My Project"
  :dependencies [[org.clojure/clojure "1.2.1"]]
  :main my-project.core)

现在-main内的my-project.core功能成为您程序的入口点。

运行它

您现在可以有两个选项来运行此项目:

  • lein run项目的根目录下,在命令行使用my-project
  • 运行lein uberjar创建独立的jar文件。然后,您可以通过运行java -jar my-project-1.0.0-SNAPSHOT-standalone.jar
  • 来运行生成的jar文件

答案 1 :(得分:1)

想出来。我有来自git的最新leiningen,不知何故被borked。我检查了1.6.1标签并运行自我安装,现在它可以工作。

答案 2 :(得分:0)

你说上面

lein new foo

你的意思是

lein new test

答案 3 :(得分:0)

我错过了,你命名了你的项目测试,你不能这样做,将名称更改为其他可行的名称。