独立clojure应用程序

独立clojure应用程序,clojure,classnotfoundexception,leiningen,Clojure,Classnotfoundexception,Leiningen,我是clojure的初学者,昨天才开始 我发现创建独立应用程序的一个简单方法是使用leiningenlein new foo 我试图用leiningen创建一个hello world测试项目。我在project.clj中添加了:main和:aot指令,在core.clj文件中添加了:gen class,并尝试了lein run,但没有找到有关类定义的错误 Exception in thread "main" java.lang.NoClassDefFoundError: Caused by:

我是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

你上面说的

lein new foo
你的意思是

lein new test

[2013年4月更新]

Leiningen2已经正式发布了一段时间,它包含了项目模板的概念。默认情况下,Leiningen提供了一个
应用程序
模板,可以提供您所需的现成内容。尝试:


lein新应用程序我的项目

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

  • myproject.core
    的默认名称空间,作为
    project.clj
    文件中的
    :main
    条目
  • :gen类
    表单位于
    我的项目.core的命名空间声明中
  • my project.core
    命名空间中的默认
    -main
    函数
对于那些还不能使用Leiningen 2的用户,该插件提供了与Leiningen 1相同的体验

[/UPDATE]

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

安装程序 您现在应该有了一个基本的结构,并且在
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)
现在,
我的项目.core中的
-main
函数成为程序的入口点

运行它 您现在可以使用两个选项来运行此项目:

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

我错过了,你给你的项目命名了测试,你不能这样做,把名字改成其他它可以工作的东西。

找到了答案。我从git那里得到了最新的leiningen,不知怎么的,它坏了。我签出了1.6.1标记并运行了自安装,现在它可以运行了。

您的类路径设置为什么?@deong my$HOME/bin/clj文件具有“CLASSPATH=。:$CLASSPATH”如果您在shell中执行“export CLASSPATH=。:$CLASSPATH”,然后运行“lein run”,会发生什么?我不相信leiningen调用CLJShell脚本来运行您的程序。我认为它直接用clojure jar文件作为参数调用java。@deong还是一样。或者更确切地说,它甚至不能创建jar文件。lein compile给出了同样的错误嗯…我画了一个空白。clojure代码在我看来是正确的。啊,我明白你为什么这么想,但我确实使用了lein new testAs。我的编辑说,我认为错误在我的笔记本电脑环境中,因为项目直接复制到桌面时编译正常。不过,这是一篇很棒的文章,所以我将对此进行投票。我在Ubuntu的存储库中安装了git,我也有同样的问题。我也应该使用git版本吗?
(defproject my-project "1.0.0-SNAPSHOT"
  :description "My Project"
  :dependencies [[org.clojure/clojure "1.2.1"]]
  :main my-project.core)