2010-12-04 17 views
6

पर मैं इस project.clj के साथ एक सरल वेब एप्लिकेशन है:जार lein uberjar के साथ उत्पादन में विफल रहता है 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") 

इस तरह मेरा मुख्य दिखता है:

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

आरईपीएल के साथ बस ठीक काम करता है।

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 

क्या मैं गलत कर रहा हूँ हालांकि, जब मैं lein uberjar साथ एक जार पैदा करते हैं और कोशिश के रूप में यह निष्पादित करने के लिए? इसे काम करने के लिए कैसे प्राप्त करें?

यह सुनिश्चित नहीं है कि यह मायने रखता है, लेकिन मैंने देखा कि जार के अंदर मेरी फाइलें, क्लोजर स्वयं और जावा libs को .class फ़ाइलों के रूप में अनपॅक किया गया है, जबकि सभी क्लोजर libs केवल सादे .clj फ़ाइलों के रूप में मौजूद हैं।

उत्तर

2

यह एक लीनजिन 1.4.0 बग प्रतीत होता है। आप leiningen 1.3.1 के साथ uberjar बनाने का प्रयास करना चाह सकते हैं।

संपादित:

Leiningen 1.4.0 गैर परियोजना को हटा देता है .class फ़ाइलें (CLJ-322 देखें) एक Clojure बग के आसपास काम करने के लिए। स्पष्ट रूप से यह व्यवहार कभी-कभी समस्याएं पैदा कर सकता है।

आप अपने project.clj में true को :keep-non-project-classes की स्थापना द्वारा गैर परियोजना .class फ़ाइलों को हटाने से leiningen 1.4.0 रख सकते हैं।

अधिक जानकारी के लिए संबंधित leinigen issue देखें।

+0

यह काम करता है। धन्यवाद! –

संबंधित मुद्दे