Skip to content

NullPointerException when run from lein with :eval-in :leiningen #17

Open
@lread

Description

@lread

Symptom

I was upgrading some pretty dated koacha deps in MrAnderson.
It was using version 0.0-32 of the kaocha-cloverage plugin.

After upgrading to the current kaocha versions, I encoutered NullPointerExceptions:

$ lein kaocha-coverage      
Error encountered performing task 'run' with profile(s): 'base,system,user,provided,dev,kaocha'
java.lang.NullPointerException
	at kaocha.plugin.cloverage$run_cloverage.invokeStatic(cloverage.clj:134)
	at kaocha.plugin.cloverage$run_cloverage.invoke(cloverage.clj:128)
	at kaocha.plugin.cloverage$cloverage_main_hook.invokeStatic(cloverage.clj:174)
	at kaocha.plugin.cloverage$cloverage_main_hook.invoke(cloverage.clj:143)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$apply.invoke(core.clj:662)
	at kaocha.plugin$run_hook_STAR_$fn__2714.invoke(plugin.clj:91)
	at clojure.lang.PersistentVector.reduce(PersistentVector.java:343)
	at clojure.core$reduce.invokeStatic(core.clj:6885)
	at clojure.core$reduce.invoke(core.clj:6868)
	at kaocha.plugin$run_hook_STAR_.invokeStatic(plugin.clj:89)
	at kaocha.plugin$run_hook_STAR_.doInvoke(plugin.clj:88)
	at clojure.lang.RestFn.invoke(RestFn.java:445)
	at clojure.lang.AFn.applyToHelper(AFn.java:160)
	at clojure.lang.RestFn.applyTo(RestFn.java:132)
	at clojure.core$apply.invokeStatic(core.clj:673)
	at clojure.core$apply.invoke(core.clj:662)
	at kaocha.plugin$run_hook.invokeStatic(plugin.clj:100)
	at kaocha.plugin$run_hook.doInvoke(plugin.clj:99)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at kaocha.runner$run$fn__3711.invoke(runner.clj:131)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$with_bindings_STAR_.invokeStatic(core.clj:1990)
	at clojure.core$with_bindings_STAR_.doInvoke(core.clj:1990)
	at clojure.lang.RestFn.invoke(RestFn.java:425)
	at kaocha.runner$run.invokeStatic(runner.clj:130)
	at kaocha.runner$run.invoke(runner.clj:73)
	at kaocha.runner$_main_STAR_.invokeStatic(runner.clj:176)
	at kaocha.runner$_main_STAR_.doInvoke(runner.clj:144)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$apply.invoke(core.clj:662)
	at kaocha.runner$_main.invokeStatic(runner.clj:187)
	at kaocha.runner$_main.doInvoke(runner.clj:185)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.lang.Var.invoke(Var.java:388)
	at user$eval663.invokeStatic(NO_SOURCE_FILE:0)
	at user$eval663.invoke(NO_SOURCE_FILE)
	at clojure.lang.Compiler.eval(Compiler.java:7194)
	at clojure.lang.Compiler.eval(Compiler.java:7184)
	at clojure.lang.Compiler.eval(Compiler.java:7149)
	at clojure.core$eval.invokeStatic(core.clj:3215)
	at clojure.core$eval.invoke(core.clj:3211)
	at leiningen.core.eval$fn__7195.invokeStatic(eval.clj:344)
	at leiningen.core.eval$fn__7195.invoke(eval.clj:336)
	at clojure.lang.MultiFn.invoke(MultiFn.java:234)
	at leiningen.core.eval$eval_in_project.invokeStatic(eval.clj:368)
	at leiningen.core.eval$eval_in_project.invoke(eval.clj:358)
	at leiningen.core.eval$eval_in_project.invokeStatic(eval.clj:362)
	at leiningen.core.eval$eval_in_project.invoke(eval.clj:358)
	at leiningen.run$run_main.invokeStatic(run.clj:130)
	at leiningen.run$run_main.invoke(run.clj:123)
	at leiningen.run$run.invokeStatic(run.clj:157)
	at leiningen.run$run.doInvoke(run.clj:134)
	at clojure.lang.RestFn.applyTo(RestFn.java:139)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$apply.invoke(core.clj:662)
	at leiningen.core.main$partial_task$fn__7376.doInvoke(main.clj:284)
	at clojure.lang.RestFn.applyTo(RestFn.java:139)
	at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$apply.invoke(core.clj:662)
	at leiningen.core.main$apply_task.invokeStatic(main.clj:334)
	at leiningen.core.main$apply_task.invoke(main.clj:320)
	at leiningen.with_profile$with_profiles_STAR_.invokeStatic(with_profile.clj:14)
	at leiningen.with_profile$with_profiles_STAR_.invoke(with_profile.clj:8)
	at leiningen.with_profile$apply_task_with_profiles.invokeStatic(with_profile.clj:53)
	at leiningen.with_profile$apply_task_with_profiles.invoke(with_profile.clj:45)
	at leiningen.with_profile$with_profile$fn__12011.invoke(with_profile.clj:85)
	at clojure.core$mapv$fn__8535.invoke(core.clj:6979)
	at clojure.core.protocols$fn__8249.invokeStatic(protocols.clj:168)
	at clojure.core.protocols$fn__8249.invoke(protocols.clj:124)
	at clojure.core.protocols$fn__8204$G__8199__8213.invoke(protocols.clj:19)
	at clojure.core.protocols$seq_reduce.invokeStatic(protocols.clj:31)
	at clojure.core.protocols$fn__8236.invokeStatic(protocols.clj:75)
	at clojure.core.protocols$fn__8236.invoke(protocols.clj:75)
	at clojure.core.protocols$fn__8178$G__8173__8191.invoke(protocols.clj:13)
	at clojure.core$reduce.invokeStatic(core.clj:6886)
	at clojure.core$mapv.invokeStatic(core.clj:6970)
	at clojure.core$mapv.invoke(core.clj:6970)
	at leiningen.with_profile$with_profile.invokeStatic(with_profile.clj:85)
	at leiningen.with_profile$with_profile.doInvoke(with_profile.clj:63)
	at clojure.lang.RestFn.applyTo(RestFn.java:146)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$apply.invoke(core.clj:662)
	at leiningen.core.main$partial_task$fn__7376.doInvoke(main.clj:284)
	at clojure.lang.RestFn.invoke(RestFn.java:410)
	at clojure.lang.AFn.applyToHelper(AFn.java:154)
	at clojure.lang.RestFn.applyTo(RestFn.java:132)
	at clojure.lang.AFunction$1.doInvoke(AFunction.java:31)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invokeStatic(core.clj:669)
	at clojure.core$apply.invoke(core.clj:662)
	at leiningen.core.main$apply_task.invokeStatic(main.clj:334)
	at leiningen.core.main$apply_task.invoke(main.clj:320)
	at leiningen.core.main$resolve_and_apply.invokeStatic(main.clj:343)
	at leiningen.core.main$resolve_and_apply.invoke(main.clj:336)
	at leiningen.core.main$_main$fn__7465.invoke(main.clj:453)
	at leiningen.core.main$_main.invokeStatic(main.clj:442)
	at leiningen.core.main$_main.doInvoke(main.clj:439)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.main$main_opt.invokeStatic(main.clj:514)
	at clojure.main$main_opt.invoke(main.clj:510)
	at clojure.main$main.invokeStatic(main.clj:664)
	at clojure.main$main.doInvoke(main.clj:616)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.main.main(main.java:40)

Exploration

I had a peek a the plugin code that throws and saw:

decls (-> []
(.getClass)
(.getClassLoader)
(.getResources "data_readers.clj")
enumeration-seq)

If I try this in code in a lein repl I can reproduce the nil:

$ lein repl
nREPL server started on port 54918 on host 127.0.0.1 - nrepl://127.0.0.1:54918
REPL-y 0.5.1, nREPL 0.9.0
Clojure 1.11.1
OpenJDK 64-Bit Server VM 11.0.16.1+1
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> (-> [] (.getClass) (.getClassLoader))
nil

If I do this from a clojure REPL all is good:

$ clj
Clojure 1.11.1
user=> (-> [] (.getClass) (.getClassLoader))
#object[jdk.internal.loader.ClassLoaders$AppClassLoader 0x277050dc "jdk.internal.loader.ClassLoaders$AppClassLoader@277050dc"]

I noticed that this change came from lein-cloverage and found a similar issue raised over there.

I then noticed MrAnderson is using :eval-in :leiningen in its project.clj.

Workaround

In MrAnderson's project.clj :kaocha profile, I set :eval-in :sub-process.

Next Steps

Please feel free to close this issue if it is expected behaviour.

If it does represent an issue, I am happy to help in any way I can.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Status

Candidate

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions