如何在运行由'lein uberjar'制作的jar时设置类路径?

时间:2010-08-02 17:36:45

标签: clojure leiningen

我有一个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'得到以下结构。

.
|-- README
|-- classes
|   `-- myproject
|-- lib
|   |-- clojure-1.2.0-beta1.jar
|   |-- clojure-contrib-1.2.0-beta1.jar
|   `-- lucene-core-3.0.2.jar
|-- project.clj
|-- src
|   `-- myproject
|       `-- core.clj
`-- test
    `-- myproject
        `-- test
            `-- 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 a d d
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.io.FileNotFoundException: Could not locate hello__init.class or hello.clj on classpath:  (core.clj:0)
...
  • 可能有什么问题?错误消息说hello.clj不在类路径上。但是,如何使用'lein uberjar'设置类路径?

我上传了项目here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

clj应该在你的project-root / src中。有了它应该工作。有关类似项目的示例,请参阅leiningen项目。柳叶刀命名空间位于src:

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