Clojure 如何在运行由';莱恩·尤贝加尔';?

Clojure 如何在运行由';莱恩·尤贝加尔';?,clojure,leiningen,Clojure,Leiningen,我有一个hello.clj如下 (ns hello) (defn hi [] (println "HI")) 通常,我可以从main.clj使用这个函数,如下所示。hello.clj位于包含main.clj的同一目录中。类路径包括。(当前路径) 我如何使用hello.clj作为“lein uberjar” 我用了“莱因”这个新项目;lein deps’获得以下结构 . |-- README |-- classes | `-- myproject |-- lib | |-- cloju

我有一个hello.clj如下

(ns hello) 
(defn hi [] (println "HI"))
通常,我可以从main.clj使用这个函数,如下所示。hello.clj位于包含main.clj的同一目录中。类路径包括。(当前路径)

我如何使用hello.clj作为“lein uberjar”

我用了“莱因”这个新项目;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 core.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)    
(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) ... prosseek:myproject smcho$java-jar myproject-1.0.0-SNAPSHOT-standalone.jar a d 线程“main”java.lang.ExceptionInInitializeError中出现异常 原因:java.io.FileNotFoundException:在类路径:(core.clj:0)上找不到hello\uu init.class或hello.clj ...
  • 可能有什么问题?错误消息说hello.clj不在类路径上。但是,如何使用“lein uberjar”设置类路径

我上传了项目。

clj应该在项目根目录/src中。有了这一点,它应该会起作用。有关类似项目的示例,请参见leiningen项目。lancet命名空间位于src内部:


您将hello.clj放在src/myproject下,因此它的ns应该是myproject.hello。使用这种文件结构,我希望hello.clj说
(ns myproject.hello)
,core.clj说
(使用'myproject.hello)

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

$ java -jar myproject-standalone.jar a b c
Welcome to my project! These are your args: (a b c)
hello
HI

我有点误解了你的问题。:)是的,如果你有兴趣在你的项目中打招呼,是的,你可以把它放在/src/myproject中,把名称空间改为myproject.hello。但是,如果您使用的是另一个项目中的另一个名称空间(如leiningen中使用的lancet),那么上述将hello.clj放在自己的名称空间中并添加到/src下的方法也可以很好地工作。当您刚刚在Clojure land时,它可以正常工作,但一旦您执行AOT以便可以启动uberjar myproject.core,它就会变成Java字节码,并且无法访问hello命名空间,因为它没有Java包。
$ java -jar myproject-standalone.jar a b c
Welcome to my project! These are your args: (a b c)
hello
HI