Clojure 如何在运行由';莱恩·尤贝加尔';?
我有一个hello.clj如下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
(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