我是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 回答
[UPDATE April 2013]
Leiningen 2已经正式发布一段时间,其中包括项目模板的概念 . 默认情况下,Leiningen提供了一个
app
模板,可以提供开箱即用的功能 . 尝试:lein new app my-project
您将看到Leiningen创建了熟悉的项目模板,但还包括:
my-project.core
的默认命名空间作为project.clj
文件中的:main
条目my-project.core
的名称空间声明中的:gen-class
表单my-project.core
命名空间中的默认-main
函数对于那些还不能使用Leiningen 2的人来说,lein-newnew插件在Leiningen 1下提供了相同的体验 .
[/UPDATE]
要构建一个项目,在运行时打印“Hello World!”,您将执行以下操作(上述过程的修订):
设置
您现在应该有一个基本结构和
lib
文件夹中的Clojure jar .编写一个函数
现在使用您选择的编辑器编辑
src/my_project/core.clj
,在(ns ...)
表单下面添加以下内容:此函数位于
my-project.core
命名空间内 . 为了确保它作为主要运行,让我们在顶部的命名空间定义中添加gen-class
参数,以便它现在看起来像在core.clj
的顶部:总而言之,你的
core.clj
文件看起来像这样:将其配置为主要功能
如上所述编辑
src/my_project/core.clj
后,您需要告诉Leiningen(构建工具)项目的"main"函数所在的位置 . 这是一个示例defproject
表单,它执行此操作:现在
my-project.core
中的-main
函数成为程序的入口点 .运行它
您现在可以有两个选项来运行此项目:
在
my-project
项目的根目录下的命令行中使用lein run
运行
lein uberjar
创建独立的jar文件 . 然后,您可以通过运行java -jar my-project-1.0.0-SNAPSHOT-standalone.jar
来运行生成的jar文件弄清楚了 . 我从git获得了最新的leiningen,不知何故被borked . 我检查了1.6.1标签并运行自我安装,现在它可以正常工作 .
你说上面
你的意思是
我错过了,你命名你的项目测试,你不能这样做,将名称更改为其他工作 .