luminus-framework / luminus-template

a template project for the Luminus framework
http://www.luminusweb.net/
MIT License
646 stars 147 forks source link

"No such var: clojure.core.cache/through" when compiling handler.clj #56

Closed john2x closed 10 years ago

john2x commented 10 years ago

When I try to lein repl or lein ring server a project, I'm getting this stacktrace:

I was working on a fork just trying something out, so I lein install my local copy. I proceed to create a test project and everything went well, but when I did lein repl, this error shows up. I thought maybe my changes caused it, so I reverted by removing the template project from ~/.m2/repository and then trying again. Here's the result:

$ lein new luminus test
Retrieving luminus/lein-template/1.11.5/lein-template-1.11.5.jar from clojars
Generating a lovely new Luminus project named test...
$ lein repl
Compiling test.handler
Exception in thread "main" java.lang.RuntimeException: No such var: clojure.core.cache/through, compiling:(clojure/core/memoize.clj:52:3)
        at clojure.lang.Compiler.analyze(Compiler.java:6380)
        at clojure.lang.Compiler.analyze(Compiler.java:6322)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3573)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6562)
        at clojure.lang.Compiler.analyze(Compiler.java:6361)
        at clojure.lang.Compiler.analyze(Compiler.java:6322)
        at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
        at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
        at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
        at clojure.lang.Compiler.analyze(Compiler.java:6361)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
        at clojure.lang.Compiler.analyze(Compiler.java:6361)
        at clojure.lang.Compiler.access$100(Compiler.java:37)
        at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
        at clojure.lang.Compiler.analyze(Compiler.java:6361)
        at clojure.lang.Compiler.analyze(Compiler.java:6322)
        at clojure.lang.Compiler.compile1(Compiler.java:7148)
        at clojure.lang.Compiler.compile(Compiler.java:7219)
        at clojure.lang.RT.compile(RT.java:398)
        at clojure.lang.RT.load(RT.java:438)
        at clojure.lang.RT.load(RT.java:411)
        at clojure.core$load$fn__5018.invoke(core.clj:5530)
        at clojure.core$load.doInvoke(core.clj:5529)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5336)
        at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
        at clojure.core$load_lib.doInvoke(core.clj:5374)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$load_libs.doInvoke(core.clj:5413)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:621)
        at clojure.core$use.doInvoke(core.clj:5507)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at ring.middleware.format_response$loading__4910__auto__.invoke(format_response.clj:1)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
        at clojure.lang.Compiler.compile1(Compiler.java:7153)
        at clojure.lang.Compiler.compile1(Compiler.java:7143)
        at clojure.lang.Compiler.compile(Compiler.java:7219)
        at clojure.lang.RT.compile(RT.java:398)
        at clojure.lang.RT.load(RT.java:438)
        at clojure.lang.RT.load(RT.java:411)
        at clojure.core$load$fn__5018.invoke(core.clj:5530)
        at clojure.core$load.doInvoke(core.clj:5529)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5336)
        at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
        at clojure.core$load_lib.doInvoke(core.clj:5374)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$load_libs.doInvoke(core.clj:5417)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$require.doInvoke(core.clj:5496)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at ring.middleware.format$loading__4910__auto__.invoke(format.clj:1)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
        at clojure.lang.Compiler.compile1(Compiler.java:7153)
        at clojure.lang.Compiler.compile1(Compiler.java:7143)
        at clojure.lang.Compiler.compile(Compiler.java:7219)
        at clojure.lang.RT.compile(RT.java:398)
        at clojure.lang.RT.load(RT.java:438)
        at clojure.lang.RT.load(RT.java:411)
        at clojure.core$load$fn__5018.invoke(core.clj:5530)
        at clojure.core$load.doInvoke(core.clj:5529)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5336)
        at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
        at clojure.core$load_lib.doInvoke(core.clj:5374)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$load_libs.doInvoke(core.clj:5413)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:621)
        at clojure.core$use.doInvoke(core.clj:5507)
        at clojure.lang.RestFn.invoke(RestFn.java:930)
        at noir.util.middleware$loading__4910__auto__.invoke(middleware.clj:1)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
        at clojure.lang.Compiler.compile1(Compiler.java:7153)
        at clojure.lang.Compiler.compile1(Compiler.java:7143)
        at clojure.lang.Compiler.compile(Compiler.java:7219)
        at clojure.lang.RT.compile(RT.java:398)
        at clojure.lang.RT.load(RT.java:438)
        at clojure.lang.RT.load(RT.java:411)
        at clojure.core$load$fn__5018.invoke(core.clj:5530)
        at clojure.core$load.doInvoke(core.clj:5529)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5336)
        at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
        at clojure.core$load_lib.doInvoke(core.clj:5374)
        at clojure.lang.RestFn.applyTo(RestFn.java:142)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$load_libs.doInvoke(core.clj:5413)
        at clojure.lang.RestFn.applyTo(RestFn.java:137)
        at clojure.core$apply.invoke(core.clj:619)
        at clojure.core$require.doInvoke(core.clj:5496)
        at clojure.lang.RestFn.invoke(RestFn.java:619)
        at test.handler$loading__4910__auto__.invoke(handler.clj:1)
        at clojure.lang.AFn.applyToHelper(AFn.java:159)
        at clojure.lang.AFn.applyTo(AFn.java:151)
        at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
        at clojure.lang.Compiler.compile1(Compiler.java:7153)
        at clojure.lang.Compiler.compile1(Compiler.java:7143)
        at clojure.lang.Compiler.compile(Compiler.java:7219)
        at clojure.lang.RT.compile(RT.java:398)
        at clojure.lang.RT.load(RT.java:438)
        at clojure.lang.RT.load(RT.java:411)
        at clojure.core$load$fn__5018.invoke(core.clj:5530)
        at clojure.core$load.doInvoke(core.clj:5529)
        at clojure.lang.RestFn.invoke(RestFn.java:408)
        at clojure.core$load_one.invoke(core.clj:5336)
        at clojure.core$compile$fn__5023.invoke(core.clj:5541)
        at clojure.core$compile.invoke(core.clj:5540)
        at user$eval1909.invoke(form-init8504690878451559471.clj:1)
        at clojure.lang.Compiler.eval(Compiler.java:6619)
        at clojure.lang.Compiler.eval(Compiler.java:6609)
        at clojure.lang.Compiler.load(Compiler.java:7064)
        at clojure.lang.Compiler.loadFile(Compiler.java:7020)
        at clojure.main$load_script.invoke(main.clj:294)
        at clojure.main$init_opt.invoke(main.clj:299)
        at clojure.main$initialize.invoke(main.clj:327)
        at clojure.main$null_opt.invoke(main.clj:362)
        at clojure.main$main.doInvoke(main.clj:440)
        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)
Caused by: java.lang.RuntimeException: No such var: clojure.core.cache/through
        at clojure.lang.Util.runtimeException(Util.java:219)
        at clojure.lang.Compiler.resolveIn(Compiler.java:6848)
        at clojure.lang.Compiler.resolve(Compiler.java:6818)
        at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779)
        at clojure.lang.Compiler.analyze(Compiler.java:6343)
        ... 135 more
Compilation failed: Subprocess failed

With some digging, it seems it's lib-noir that depends on ring-middleware-format which in turn depends on clojure.core.memoize which in turn depends on clojure.core.cache. Adding org.clojure/core.cache to project.clj doesn't seem to fix the issue.

Note that prior to trying out my fork, everything was working fine. Maybe an old version of some dependency got installed when I tried out my fork?

yogthos commented 10 years ago

You could check lein deps :tree to see what dependencies are being pulled in. It looks like you likely have an old version of core.cache in your local repo. There's a similar issue here with the workarounds people found.

john2x commented 10 years ago

I see this from lein deps :tree's output.

[leiningen "2.3.4"] -> [stencil "0.3.2"] -> [org.clojure/core.cache "0.6.2"]
 overrides
[lib-noir "0.7.9"] -> [ring-middleware-format "0.3.1"] -> [org.clojure/core.memoize "0.5.6"] -> [org.clojure/core.cache "0.6.3"]

Does this mean I have to explicitly add/fix the dependency in any new projects?

yogthos commented 10 years ago

Seems like your problem is with the stencil dependency using an outdated version of core.cache. You could use :exclusions when including the dependency:

[stencil "0.3.2" :exclusions [org.clojure/core.cache]]

Normally this wouldn't happen since Luminus uses Selmer for templating by default.

john2x commented 10 years ago

It seems it's an issue with my profiles.clj. I have leiningen 2.3.4 as a dependency in my profiles.clj, and it's overriding the core.cache dependencies in other deps down the tree. Removing leiningen fixes the issue.

Is my reasoning correct?

yogthos commented 10 years ago

Yes, the profiles would likely override the other deps.

john2x commented 10 years ago

Thank you. I guess this is nobody's issue.