首页 文章

独立的clojure应用程序

提问于
浏览
18

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

    [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!”,您将执行以下操作(上述过程的修订):

    设置

    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(构建工具)项目的"main"函数所在的位置 . 这是一个示例 defproject 表单,它执行此操作:

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

    现在 my-project.core 中的 -main 函数成为程序的入口点 .

    运行它

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

    • my-project 项目的根目录下的命令行中使用 lein run

    • 运行 lein uberjar 创建独立的jar文件 . 然后,您可以通过运行 java -jar my-project-1.0.0-SNAPSHOT-standalone.jar 来运行生成的jar文件

  • 31

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

  • 1

    你说上面

    lein new foo
    

    你的意思是

    lein new test
    
  • 0

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

相关问题