2010-12-04 6 views
6

Ich habe eine einfache Web-App mit diesem project.clj:Jar mit lein uberjar produziert nicht auf NoClassDefFoundError

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

Meine Haupt sieht wie folgt aus:

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

Mit REPL funktioniert gut. Allerdings, wenn ich ein Glas mit lein uberjar und versuchen erzeugen auszuführen als:

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

Es stirbt mit dieser Ausnahme:

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 

Was mache ich falsch? Wie man es zur Arbeit bringt?

nicht sicher, ob das wichtig ist, aber ich merkte, dass meine Dateien in dem Topf, clojure selbst und Java-Libs entpackt sind als Class-Dateien, während alle clojure Libs derzeit nur als einfache .clj Dateien sind.

Antwort

2

Dies scheint ein leinigen 1.4.0 Fehler zu sein. Vielleicht möchten Sie versuchen, einen Überar mit leiningen 1.3.1 zu erstellen.

bearbeiten:

Leiningen 1.4.0 löscht nicht-Projekt .class Dateien um einen Clojure Fehler zu arbeiten (siehe CLJ-322). Offensichtlich kann dieses Verhalten manchmal Probleme verursachen.

können Sie halten Leiningen 1.4.0 aus dem Löschen nicht-Projekt .class Dateien von :keep-non-project-classes zu true in Ihrem project.clj Einstellung.

Siehe die verwandte leinigen issue für weitere Informationen.

+0

Das funktioniert. Vielen Dank! –

Verwandte Themen