clojure - 独立的 Clojure 应用程序

标签 clojure classnotfoundexception leiningen

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

最佳答案

[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 run在你的 my-project 的根目录下的命令行项目
  • 通过运行 lein uberjar 创建一个独立的 jar 文件.然后,您可以通过运行 java -jar my-project-1.0.0-SNAPSHOT-standalone.jar 来运行生成的 jar 文件。
  • 关于clojure - 独立的 Clojure 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6874338/

    相关文章:

    clojure - 用于 Clojure 中的标识 monad

    clojure - 无法运行 lein 脚本

    java - Struts2 中的 ClassNotFoundException 示例

    android - 工作应用程序上的 java.lang.ClassNotFoundException

    java - 如何解决 ClassNotFoundException?

    clojure - 在 lein repl 中需要 core.async

    clojure - 尝试理解 lein repl 错误

    clojure - 数据查询和懒惰

    Clojure:如何在异常时重现?

    clojure:根据其他键/值对计算映射中的新键/值对