How to setup the classpath when running the jar made from 'lein uberjar'?

旧巷老猫 提交于 2019-12-22 06:44:41

问题


I have a hello.clj as follows.

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

Normally, I can use this function from main.clj as follows. The hello.clj is in the same directory that contains main.clj. And the classpath includes . (current path).

(use 'hello)
(hi)

How can I use this hello.clj for the 'lein uberjar'?

I used 'lein new myproject; lein deps' to get the following structure.

.
|-- 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 is as follows.

(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)    

And core.clj is as follows.

(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)))

Now, where do I put the hello.clj? I tried to copy it to myproject/src directory and run uberjar to get the jar. But, running the jar causes this error message.

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)
...
  • What might be wrong? Error messages says hello.clj is not on the class path. But, how to setup the classpath with 'lein uberjar'?

I uploaded the project here.


回答1:


You put hello.clj under src/myproject so it's ns should be myproject.hello. With this file structure, I would expect hello.clj to say (ns myproject.hello) and for core.clj to say (use 'myproject.hello).

When I make those changes, I get:

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



回答2:


clj should be inside your project-root/src. With that it should work. For an example of a similar project, see leiningen project. The lancet namespace is inside src:

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



来源:https://stackoverflow.com/questions/3390268/how-to-setup-the-classpath-when-running-the-jar-made-from-lein-uberjar

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!