2010-12-04 30 views
6

J'ai une application simple web avec ce project.clj:pot produit avec lein uberjar échoue sur 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") 

Mes principaux ressemble à ceci:

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

Avec REPL fonctionne très bien. Cependant, quand je produis un pot avec lein uberjar et essayer de l'exécuter comme:

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

Il meurt à cette exception:

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 

Qu'est-ce que je fais mal? Comment l'obtenir au travail? Je ne sais pas si cela compte, mais j'ai remarqué qu'à l'intérieur du fichier, mes fichiers, clojure et les librairies Java sont décompressés en fichiers .class, alors que toutes les bibliothèques clojure ne sont présentes que sous la forme de fichiers .clj.

Répondre

2

Cela semble être un bug leinigen 1.4.0. Vous pourriez vouloir essayer de créer un uberjar avec leiningen 1.3.1.

Modifier:

Leiningen 1.4.0 supprime .class fichiers non-projet de travailler autour d'un bug Clojure (voir CLJ-322). Apparemment, ce comportement peut parfois causer des problèmes.

Vous pouvez garder Leiningen 1.4.0 de supprimer non-projet .class fichiers en définissant :keep-non-project-classes à true dans votre project.clj. Voir la leinigen issue pour plus d'informations.

+0

Cela fonctionne. Je vous remercie! –