如何使用包含以下内容的脚本使用clojure的编译函数:gen-class?

时间:2012-04-21 08:35:27

标签: compilation clojure classpath read-eval-print-loop

经过3天的挫折,我必须寻求帮助。作为clojure的新手,我想使用改编自clojure.org的AOT页面的(编译'examples.hello)从REPL编译这个脚本:

(ns examples.hello
    (:gen-class))

(defn -main
  [greetee]
  (println (str "Hello " greetee "!")))

我使用JEdit和clojure控制台插件作为我的编辑和leiningen的严肃项目。

$ HOME中的我的目录结构是: clojure-1.3.0(编辑以节省空间)

|-- classes
|-- clojure-1.3.0.jar
|-- clojure-1.3.0-slim.jar
|-- src
|   |-- examples
|   |   |-- hello.clj
|   |   `-- hello.clj~
|   |-- jvm
|

错误消息是:

FileNotFoundException Could not locate examples/hello__init.class or examples/hello.clj on classpath:   clojure.lang.RT.load (RT.java:430)

有些问题:

a)如果我正在编译为什么编译函数要查找我试图创建的类文件?

b)使编译功能有效的“正确”步骤是什么? c)在我的互联网上搜索这个问题时,有许多引用'classpath'或'your classpath';假设classpath引用clojure.jar等并且正在处理的脚本而不是Java $ CLASSPATH这是不正确的,因为java 1.5以来一直没有必要吗?

1 个答案:

答案 0 :(得分:0)

我为这个尴尬的答案道歉,但我还不了解Clojure的构建以及其他一些语言。所以,请耐心等待。我正在编写这个答案,你正在使用像lein这样的构建工具。

您的main-mine是addr-verify - 必须位于项目附带的project.clj指定的名称空间中。所以我的主要模块是core.clj,它将其名称空间声明为addr-verify,并且缺少更好的术语声明或使用gen-class。

我的project.clj表示main是addr-verify。

lein构建Clojure应用程序的一个好处是,它在您创建项目时为您设置了所有这些,例如lein create my-test-proj

以下是我的./addr-verify/project.clj

中的相关内容
(defproject addr-verify "1.0.0-SNAPSHOT"
  :description "TODO: add summary of your project"
  :dependencies [[org.clojure/clojure "1.2.1"]
                 [clojure-csv/clojure-csv "1.2.4"]
                 [org.clojure/tools.cli "0.1.0"]
                 [clj-http "0.1.3"]]
   :aot [addr-verify]
   :main addr-verify)

以下是./addr-verify/src/addr_verify/core.clj的前几行

(ns addr-verify
  (:gen-class)
  (:require [clojure.string :as cstr])
  (:require [clojure.contrib.str-utils :as ustr])
  (:require [clj-http.client :as client])
  (:use clojure-csv.core)
  (:use [clojure.tools.cli])
  (:import java.util.Date)
  (:import java.lang.Thread)
  (:import java.io.File)