leiningen - Clojure/Midje using AOT compilation with tests inside source fails to run -
i'm trying include midje "facts" alongside source code in project uses aot. trying access repl or run project results in following error, i've included minimal sample project reproduces issue. help!
project.clj
(defproject test-midje "0.1.1" :description "why doesn't midje work?" :min-lein-version "2.0.0" :source-paths ["src/clj"] :repl-options { :timeout 120000 } :main org.midjetest.core :profiles {:dev {:dependencies [[midje "1.5.0"]]}} :aot [org.midjetest.core])
src/clj/org/midjetest/core.clj
(ns org.midjetest.core (:require [midje.sweet :refer [fact facts]])) (defn addtwo [a] (+ 2 a)) (fact "addtwo adds 2 numbers" (addtwo 3) => 5) (defn -main "testing main" ([] (println (addtwo 5))))
lein run
or lein repl
give following error:
$ lein repl compiling org.midjetest.core exception in thread "main" java.lang.exceptionininitializererror @ java.lang.class.forname0(native method) @ java.lang.class.forname(class.java:270) @ clojure.lang.rt.loadclassforname(rt.java:2056) @ clojure.lang.rt.load(rt.java:419) @ clojure.lang.rt.load(rt.java:400) @ clojure.core$load$fn__4890.invoke(core.clj:5415) @ clojure.core$load.doinvoke(core.clj:5414) @ clojure.lang.restfn.invoke(restfn.java:408) @ clojure.core$load_one.invoke(core.clj:5227) @ clojure.core$load_lib.doinvoke(core.clj:5264) @ clojure.lang.restfn.applyto(restfn.java:142) @ clojure.core$apply.invoke(core.clj:603) @ clojure.core$load_libs.doinvoke(core.clj:5298) @ clojure.lang.restfn.applyto(restfn.java:137) @ clojure.core$apply.invoke(core.clj:603) @ clojure.core$require.doinvoke(core.clj:5381) @ clojure.lang.restfn.invoke(restfn.java:408) @ org.midjetest.core$loading__4784__auto__.invoke(core.clj:1) @ org.midjetest.core__init.load(unknown source) @ org.midjetest.core__init.<clinit>(unknown source) @ java.lang.class.forname0(native method) @ java.lang.class.forname(class.java:270) @ clojure.lang.rt.loadclassforname(rt.java:2056) @ clojure.lang.rt.load(rt.java:419) @ clojure.lang.rt.load(rt.java:400) @ clojure.core$load$fn__4890.invoke(core.clj:5415) @ clojure.core$load.doinvoke(core.clj:5414) @ clojure.lang.restfn.invoke(restfn.java:408) @ clojure.core$load_one.invoke(core.clj:5227) @ clojure.core$load_lib.doinvoke(core.clj:5264) @ clojure.lang.restfn.applyto(restfn.java:142) @ clojure.core$apply.invoke(core.clj:603) @ clojure.core$load_libs.doinvoke(core.clj:5298) @ clojure.lang.restfn.applyto(restfn.java:137) @ clojure.core$apply.invoke(core.clj:603) @ clojure.core$require.doinvoke(core.clj:5381) @ clojure.lang.restfn.invoke(restfn.java:408) @ user$eval5.invoke(form-init9180276290836069038.clj:1) @ clojure.lang.compiler.eval(compiler.java:6511) @ clojure.lang.compiler.eval(compiler.java:6500) @ clojure.lang.compiler.eval(compiler.java:6500) @ clojure.lang.compiler.load(compiler.java:6952) @ clojure.lang.compiler.loadfile(compiler.java:6912) @ clojure.main$load_script.invoke(main.clj:283) @ clojure.main$init_opt.invoke(main.clj:288) @ clojure.main$initialize.invoke(main.clj:316) @ clojure.main$null_opt.invoke(main.clj:349) @ clojure.main$main.doinvoke(main.clj:427) @ clojure.lang.restfn.invoke(restfn.java:421) @ clojure.lang.var.invoke(var.java:419) @ clojure.lang.afn.applytohelper(afn.java:163) @ clojure.lang.var.applyto(var.java:532) @ clojure.main.main(main.java:37) caused by: java.lang.nullpointerexception @ java.util.concurrent.concurrenthashmap.hash(concurrenthashmap.java:333) @ java.util.concurrent.concurrenthashmap.get(concurrenthashmap.java:988) @ clojure.lang.namespace.find(namespace.java:188) @ clojure.core$find_ns.invoke(core.clj:3659) @ clojure.core$the_ns.invoke(core.clj:3691) @ clojure.core$ns_name.invoke(core.clj:3698) @ midje.bootstrap$bootstrap.invoke(bootstrap.clj:8) @ midje.sweet__init.load(unknown source) @ midje.sweet__init.<clinit>(unknown source) ... 53 more exception in thread "thread-4" clojure.lang.exceptioninfo: subprocess failed {:exit-code 1} @ clojure.core$ex_info.invoke(core.clj:4327) @ leiningen.core.eval$fn__3532.invoke(eval.clj:226) @ clojure.lang.multifn.invoke(multifn.java:231) @ leiningen.core.eval$eval_in_project.invoke(eval.clj:326) @ clojure.lang.afn.applytohelper(afn.java:167) @ clojure.lang.afn.applyto(afn.java:151) @ clojure.core$apply.invoke(core.clj:619) @ leiningen.repl$server$fn__7443.invoke(repl.clj:201) @ clojure.lang.afn.applytohelper(afn.java:159) @ clojure.lang.afn.applyto(afn.java:151) @ clojure.core$apply.invoke(core.clj:617) @ clojure.core$with_bindings_star_.doinvoke(core.clj:1788) @ clojure.lang.restfn.invoke(restfn.java:425) @ clojure.lang.afn.applytohelper(afn.java:163) @ clojure.lang.restfn.applyto(restfn.java:132) @ clojure.core$apply.invoke(core.clj:621) @ clojure.core$bound_fn_star_$fn__4102.doinvoke(core.clj:1810) @ clojure.lang.restfn.invoke(restfn.java:397) @ clojure.lang.afn.run(afn.java:24) @ java.lang.thread.run(thread.java:744)
the root problem here bootstrap.clj not going work when aot-ed; depends on namespace being loaded before is; static initializers clojure aoted classes more or less equivalent to:
(binding [clojure.core/*ns* nil clojure.core/*fn-loader* loader clojure.core/*read-eval* true] (my.class/load))
since bootstrap/bootstrap called before midje.sweet defines it's own ns (https://github.com/marick/midje/blob/master/src/midje/sweet.clj#l2), *ns*
stays null, , (ns-name *ns*)
crashes.
i don't think can make work, unless bootstrap code midje changes. i'd recommend putting tests separate files, , not aot-ing those.
Comments
Post a Comment