独立的clojure应用程序

Mas*_*sse 18 clojure leiningen classnotfoundexception

我是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)
Run Code Online (Sandbox Code Playgroud)

core.clj文件

(ns test.core
  (:gen-class))
(defn -main [& args] (println "Hello main"))
Run Code Online (Sandbox Code Playgroud)

和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"]])
Run Code Online (Sandbox Code Playgroud)

编辑:经过进一步测试,似乎将项目复制到我的桌面工作原样,我认为我的笔记本电脑上的环境有点笨拙,但我不知道如何.

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

sem*_*ros 31

[更新于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下提供了相同的体验.

[/ UPDATE]

要构建一个项目,在运行时打印"Hello World!",您将执行以下操作(上述过程的修订):

建立

lein new my-project
cd my-project
lein deps
Run Code Online (Sandbox Code Playgroud)

您现在应该有一个基本结构和lib文件夹中的Clojure jar .

写一个函数

现在src/my_project/core.clj使用您选择的编辑器进行编辑,在(ns ...)表单下方添加以下内容:

(defn -main []
  (println "Hello World!"))
Run Code Online (Sandbox Code Playgroud)

此函数位于my-project.core命名空间内.为了确保它作为主要运行,让我们gen-class在顶部的命名空间定义中添加一个参数,以便它现在看起来像这样core.clj:

(ns my-project.core
  (:gen-class :main true))
Run Code Online (Sandbox Code Playgroud)

总而言之,您的core.clj文件如下所示:

(ns my-project.core
  (:gen-class :main true))

(defn -main []
  (println "Hello World!"))
Run Code Online (Sandbox Code Playgroud)

将其配置为主要功能

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)
Run Code Online (Sandbox Code Playgroud)

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

运行

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

  • lein runmy-project项目的根目录下使用命令行
  • 通过运行创建独立的jar文件lein uberjar.然后,您可以通过运行运行生成的jar文件java -jar my-project-1.0.0-SNAPSHOT-standalone.jar


Mas*_*sse 1

弄清楚了。我从 git 那里得到了最新的 leiningen,不知怎么的,它有点无聊。我检查了 1.6.1 标签并运行了自我安装,现在它可以工作了。