【问题标题】:Standalone clojure app独立的 Clojure 应用程序
【发布时间】:2011-10-16 00:05:32
【问题描述】:

我是 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"]])

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

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

【问题讨论】:

  • 您的 CLASSPATH 设置为什么?
  • @deong 我的 $HOME/bin/clj 文件有“CLASSPATH=.:$CLASSPATH”
  • 如果您只是在 shell 中执行“export CLASSPATH=.:$CLASSPATH”然后运行“lein run”会发生什么?我不相信 leiningen 调用 clj shell 脚本来运行你的程序。我认为它直接以clojure jar文件作为参数调用java。
  • @deong 还是一样。或者更确切地说,它甚至无法创建 jar 文件。 lein compile 给出同样的错误
  • 嗯...那我画个空白。 clojure 代码对我来说很合适。

标签: clojure classnotfoundexception leiningen


【解决方案1】:

[2013 年 4 月更新]

正式发布一段时间的Leiningen 2,包含了项目模板的概念。默认情况下,Leiningen 提供了一个app 模板,它提供了你需要的开箱即用的东西。试试:

lein new app my-project

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

  • my-project.core 的默认命名空间作为 :main 条目在您的 project.clj 文件中
  • 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(构建工具)您项目的“主要”功能所在的位置。这是一个示例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 文件

【讨论】:

  • 正如我的编辑所说,我认为错误出在我的笔记本电脑环境中,因为项目在直接复制到桌面时编译正常。然而,一个伟大的职位,所以我会赞成它。
【解决方案2】:

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

【讨论】:

  • 我已经从 Ubuntu 的存储库中安装了 git,我也遇到了同样的问题。我也应该使用 git 版本吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你在上面说

    lein new foo
    

    你的意思是

    lein new test
    

    【讨论】:

    • 啊,我明白你为什么这么想了,但我确实使用了 lein new test
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多