18

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

我已经收集到创建独立应用程序的简单方法是使用 leiningen lein new foo

我试图用 leiningen 创建一个 hello world 测试项目。我在 project.clj 中添加了 :main 和 :aot 指令,在 core.clj 文件中添加了 :gen-class 并尝试了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"]])

编辑:经过进一步测试,将项目复制到我的桌面似乎可以正常工作,我认为这表明我的笔记本电脑上的环境有些无聊,但我不知道如何。

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

4

4 回答 4

35

[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 相同的体验。

[/更新]

要构建一个在运行时打印“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 runmy-project项目根目录下的命令行中使用
  • 通过运行创建一个独立的 jar 文件lein uberjar。然后,您可以通过运行运行生成的 jar 文件java -jar my-project-1.0.0-SNAPSHOT-standalone.jar
于 2011-07-29T19:05:24.300 回答
1

弄清楚了。我从 git 获得了最新的 leiningen,不知何故被搞砸了。我检查了 1.6.1 标签并运行了自我安装,现在它可以工作了。

于 2011-08-01T14:09:46.350 回答
0

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

于 2011-07-29T19:15:36.673 回答
-1

你上面说

lein new foo

你的意思是

lein new test
于 2011-07-29T18:36:04.943 回答