【问题标题】:How to setup the classpath when running the jar made from 'lein uberjar'?运行由'lein uberjar'制作的jar时如何设置类路径?
【发布时间】:2011-03-24 08:19:35
【问题描述】:

我有一个 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 a d d 线程“主”java.lang.ExceptionInInitializerError 中的异常 原因:java.io.FileNotFoundException:无法在类路径上找到 hello__init.class 或 hello.clj:(core.clj:0) ...
  • 可能出了什么问题?错误消息说 hello.clj 不在类路径上。但是,如何使用 'lein uberjar' 设置类路径?

我上传了项目here

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    你把 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
    

    【讨论】:

    • 您尝试使用 (ns hello) 进行的操作称为单段命名空间。虽然当您在 Clojure 领域时它工作正常,但一旦您执行 AOT 以作为 uberjar 启动,myproject.core 就会变成 Java 字节码,并且由于它没有 java 包而无法进入 hello 命名空间。
    【解决方案2】:

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

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

    【讨论】:

    • 我有点误解了你的问题。:) 是的,如果你有兴趣将你好作为你项目的一部分,是的,你把它放在 /src/myproject 中,并将 ethe 命名空间声明为我的项目。你好。但是,如果您正在使用来自另一个项目的另一个命名空间(例如 leiningen 中使用的 lancet),那么上述将 hello.clj 放入其自己的命名空间并添加到 /src 下的方法也可以正常工作。
    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-02-06
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多