2013-01-04 11 views
5

stworzyłem prosty przykład przy użyciu:Lein uberjar nie działa poprawnie, ale może nie rozumiem wszystkiego, co robi?

%> lein new lein-check 

Mam tylko zmodyfikowany kod tak, że ma teraz „main”:

(defproject lein-check "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :main "lein-check.core" 
    :dependencies [[org.clojure/clojure "1.4.0"]]) 

(ns lein-check.core 
    (:gen-class)) 

(defn -main 
    "I don't do a whole lot." 
    [& args] 
    (println "Hello, World!")) 

Ale pierwszy raz uruchomić lein uberjar nawet po clean uzyskać to:

Compiling lein-check.core 
Exception in thread "main" java.lang.ClassCastException: 
    java.lang.String cannot be cast to clojure.lang.Symbol 
     at clojure.core$find_ns.invoke(core.clj:3659) 
     at clojure.core$load_one.invoke(core.clj:5228) 
     at clojure.core$compile$fn__4895.invoke(core.clj:5426) 
     at clojure.core$compile.invoke(core.clj:5425) 
     at user$eval7.invoke(NO_SOURCE_FILE:1) 
     at clojure.lang.Compiler.eval(Compiler.java:6511) 
     at clojure.lang.Compiler.eval(Compiler.java:6501) 
     at clojure.lang.Compiler.eval(Compiler.java:6477) 
     at clojure.core$eval.invoke(core.clj:2797) 
     at clojure.main$eval_opt.invoke(main.clj:297) 
     at clojure.main$initialize.invoke(main.clj:316) 
     at clojure.main$null_opt.invoke(main.clj:349) 
     at clojure.main$main.doInvoke(main.clj:427) 
     at clojure.lang.RestFn.invoke(RestFn.java:421) 
     at clojure.lang.Var.invoke(Var.java:419) 
     at clojure.lang.AFn.applyToHelper(AFn.java:163) 
     at clojure.lang.Var.applyTo(Var.java:532) 
     at clojure.main.main(main.java:37) 
Compilation failed: Subprocess failed 

Running kontynuacją uberjar choć z powodzeniem tworzy j ars:

Created ....\lein-check-0.1.0-SNAPSHOT.jar 
Including lein-check-0.1.0-SNAPSHOT.jar 
Including clojure-1.4.0.jar 
Created ....\lein-check-0.1.0-SNAPSHOT-standalone.jar 

Czy uberjar czasami działa po zakończeniu? Czy ma to zrobić? Nie jestem do końca pewien, czy jest to błąd użytkownika, błąd lein czy błąd typu clojure.

Odpowiedz

3

Problem polega na linii

:main "lein-check.core" 

Należy

:main lein-check.core 

Używasz ciąg zamiast symbolu.

+0

Prawo - tak samo jak moją odpowiedź przypuszczam, z wyjątkiem mam cytowany „symbol dla: Main, i oba wydają się działać. – lucidquiet

2

Okazuje się, że Lein Sample Project pokazuje :main jako symbol, a nie ciąg. Po zaktualizowaniu tego działa lein uberjar działa zgodnie z oczekiwaniami.

Linia ta w szczególności:

:main "lein-check.core"

zmienione na:

:main 'lein-check.core