5

我有一个 hello.clj 如下。

(ns hello) 
(defn hi [] (println "HI"))

通常,我可以使用 main.clj 中的这个函数,如下所示。hello.clj 位于包含 main.clj 的同一目录中。并且类路径包括 . (当前路径)。

(use 'hello)
(hi)

如何将此 hello.clj 用于“lein uberjar”?

我用'lein new myproject; lein deps' 得到以下结构。

.
|-- 自述文件
|-- 班级
| `-- 我的项目
|-- 库
| |-- clojure-1.2.0-beta1.jar
| |-- clojure-contrib-1.2.0-beta1.jar
| `-- lucene-core-3.0.2.jar
|-- 项目.clj
|-- 源
| `-- 我的项目
| `--core.clj
`-- 测试
    `-- 我的项目
        `-- 测试
            `--core.clj

project.clj 如下。

(defproject myproject "1.0.0-SNAPSHOT"
  :description "FIXME: write"
  :dependencies [[org.clojure/clojure "1.2.0-beta1"]
                 [org.clojure/clojure-contrib "1.2.0-beta1"]
                 [org.apache.lucene/lucene-core "3.0.2"]]
  :main myproject.core)    

而core.clj如下。

(ns myproject.core
  (:gen-class))

(use 'hello) 

(defn test1 [] (println "hello"))

(defn -main [& args]
  (do 
    (println "Welcome to my project! These are your args:" args)
    (test1)
    (hi)))

现在,我将 hello.clj 放在哪里?我试图将它复制到 myproject/src 目录并运行 uberjar 来获取 jar。但是,运行 jar 会导致此错误消息。

prosseek:myproject smcho$ java -jar myproject-1.0.0-SNAPSHOT-standalone.jar 添加
线程“主”java.lang.ExceptionInInitializerError 中的异常
原因:java.io.FileNotFoundException:无法在类路径上找到 hello__init.class 或 hello.clj:(core.clj:0)
...
  • 可能有什么问题?错误消息说 hello.clj 不在类路径上。但是,如何使用 'lein uberjar' 设置类路径?

我在这里上传了项目。

4

2 回答 2

7

你把 hello.clj 放在 src/myproject 下,所以它的 ns 应该是 myproject.hello。有了这个文件结构,我希望 hello.clj 说(ns myproject.hello)和 core.clj 说(use 'myproject.hello)

当我进行这些更改时,我得到:

$ java -jar myproject-standalone.jar a b c
Welcome to my project! These are your args: (a b c)
hello
HI
于 2010-08-02T19:51:34.207 回答
0

clj 应该在您的项目根目录/src 中。有了它,它应该可以工作。有关类似项目的示例,请参阅 leiningen 项目。lancet 命名空间在 src 中:

http://github.com/technomancy/leiningen/tree/master/src/

于 2010-08-02T18:37:11.067 回答