【问题标题】:Jar produced with lein uberjar fails on NoClassDefFoundError使用 lein uberjar 生成的 Jar 在 NoClassDefFoundError 上失败
【发布时间】:2011-05-20 06:01:42
【问题描述】:

我有一个带有这个 project.clj 的简单网络应用程序:

(defproject squirrel-money "1.0.0-SNAPSHOT"
  :description "Squirrel Money"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]
                 [compojure "0.5.3"]
                 [ring/ring-jetty-adapter "0.3.5"]
                 [hiccup "0.3.1"]
                 [postgresql "8.4-701.jdbc4"]
                 [clj-time "0.2.0-SNAPSHOT"]]
  :dev-dependencies [[lein-eclipse "1.0.0"]]
  :main squirrel-money.main
  :repl-init-script "src/squirrel_money/init_repl.clj")

我的主要看起来像这样:

(ns squirrel-money.main
  (:gen-class)
  (:use 
    [compojure.core]
    [ring.adapter.jetty])
  (:require 
    [compojure.route :as route]
    [squirrel-money.savings :as savings]))

(defn launch [routedef]
  (run-jetty routedef {:port 17080}))

(defroutes money-routes
  (GET "/savings" [] (savings/render))
  (route/not-found "Page not found"))

(defn -main [& args] (launch money-routes))

使用 REPL 可以正常工作。但是,当我使用lein uberjar 生成一个 jar 并尝试将其执行为:

java -jar squirrel-money-1.0.0-SNAPSHOT-standalone.jar

它死于此异常:

Exception in thread "main" java.lang.NoClassDefFoundError: compojure/response/Renderable
    at squirrel_money.main$fn__1067.invoke(main.clj:18)
    at squirrel_money.main__init.load(Unknown Source)
    at squirrel_money.main__init.<clinit>(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at clojure.lang.RT.loadClassForName(RT.java:1578)
    at clojure.lang.RT.load(RT.java:399)
    at clojure.lang.RT.load(RT.java:381)
    at clojure.core$load$fn__4511.invoke(core.clj:4905)
    at clojure.core$load.doInvoke(core.clj:4904)
    at clojure.lang.RestFn.invoke(RestFn.java:409)
    at clojure.lang.Var.invoke(Var.java:365)
    at squirrel_money.main.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: compojure.response.Renderable
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    ... 13 more

我做错了什么?如何让它工作?

不确定这是否重要,但我注意到在 jar 中我的文件、clojure 本身和 Java 库被解压缩为 .class 文件,而所有 clojure 库仅作为普通的 .clj 文件存在。

【问题讨论】:

    标签: clojure compojure leiningen


    【解决方案1】:

    这似乎是 leinigen 1.4.0 的错误。您可能想尝试使用 leiningen 1.3.1 创建一个 uberjar。

    编辑

    Leiningen 1.4.0 删除非项目 .class 文件以解决 Clojure 错误(请参阅 CLJ-322)。显然这种行为有时会导致问题。

    您可以通过在project.clj 中将:keep-non-project-classes 设置为true 来阻止leiningen 1.4.0 删除非项目.class 文件。

    查看相关leinigen issue了解更多信息。

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      相关资源
      最近更新 更多