dundalek / closh

Bash-like shell based on Clojure
Eclipse Public License 1.0
1.62k stars 66 forks source link

Try to create uberjar with boot #90

Closed jeroenvandijk closed 5 years ago

jeroenvandijk commented 5 years ago

I tried to create an uberjar with boot (+ deps.edn) and I think I came further than the camada version, but still some issue with reader.clj:

(Assuming you have boot-clj installed [version 2.8.1 in my case])


~> boot uberjar 
Compiling 1/1 closh.zero.frontend.main...
                                       java.lang.Thread.run                  Thread.java:  748
         java.util.concurrent.ThreadPoolExecutor$Worker.run      ThreadPoolExecutor.java:  624
          java.util.concurrent.ThreadPoolExecutor.runWorker      ThreadPoolExecutor.java: 1149
                        java.util.concurrent.FutureTask.run              FutureTask.java:  266
                                                        ...
                        clojure.core/binding-conveyor-fn/fn                     core.clj: 2022
                                          boot.core/boot/fn                     core.clj: 1032
                                        boot.core/run-tasks                     core.clj: 1022
                             boot.task.built-in/fn/fn/fn/fn                 built_in.clj:  804
                                          boot.pod/eval-in*                      pod.clj:  471
                                                        ...
org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke  ClojureRuntimeShimImpl.java:  102
org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke  ClojureRuntimeShimImpl.java:  109
                                                        ...
                                          boot.pod/eval-in*                      pod.clj:  468
                                          clojure.core/eval                     core.clj: 3206
                                                        ...
                                         pod$eval167.invoke                NO_SOURCE_FILE
                                   pod$eval167.invokeStatic                NO_SOURCE_FILE
                                       clojure.core/compile                     core.clj: 6056
                                    clojure.core/compile/fn                     core.clj: 6056
                                      clojure.core/load-one                     core.clj: 5848
                                                        ...
                                          clojure.core/load                     core.clj: 6029
                                          clojure.core/load                     core.clj: 6045
                                       clojure.core/load/fn                     core.clj: 6046
                                                        ...
                   closh.zero.frontend.main/loading--auto--                     main.clj:    1
                                                        ...
                                       clojure.core/require                     core.clj: 5947 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  659
                                                        ...
                                     clojure.core/load-libs                     core.clj: 5909
                                     clojure.core/load-libs                     core.clj: 5925
                                         clojure.core/apply                     core.clj:  659
                                                        ...
                                      clojure.core/load-lib                     core.clj: 5868
                                      clojure.core/load-lib                     core.clj: 5887
                                   clojure.core/load-lib/fn                     core.clj: 5888
                                      clojure.core/load-one                     core.clj: 5848
                                                        ...
                                          clojure.core/load                     core.clj: 6029
                                          clojure.core/load                     core.clj: 6045
                                       clojure.core/load/fn                     core.clj: 6046
                                                        ...
                          closh.zero.reader/loading--auto--                   reader.clj:    1
                                                        ...
                                       clojure.core/require                     core.clj: 5947 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  659
                                                        ...
                                     clojure.core/load-libs                     core.clj: 5909
                                     clojure.core/load-libs                     core.clj: 5925
                                         clojure.core/apply                     core.clj:  659
                                                        ...
                                      clojure.core/load-lib                     core.clj: 5868
                                      clojure.core/load-lib                     core.clj: 5906
                                         clojure.core/apply                     core.clj:  659
                                                        ...
                                         clojure.core/refer                     core.clj: 4183
                                         clojure.core/refer                     core.clj: 4215
           java.lang.IllegalAccessError: READ_FINISHED is not public
clojure.lang.Compiler$CompilerException: java.lang.IllegalAccessError: READ_FINISHED is not public, compiling:(reader.clj:1:1)
             clojure.lang.ExceptionInfo: java.lang.IllegalAccessError: READ_FINISHED is not public, compiling:(reader.clj:1:1)
    line: 63
dundalek commented 5 years ago

In order to make reader customizations I needed to hook into reader internals. Some were declared private so in order to access them I have a custom reader fork.

In the trace there is the IllegalAccessError which likely means the compilation uses the stock version from maven. In order to fix that we would need to use the git version declared in deps.edn like tools.deps does.

jeroenvandijk commented 5 years ago

Ah cool. I didn't recognized the error and assumed it was the reader, but then I need to improve the tools.deps integration instead. Will try again

jeroenvandijk commented 5 years ago

Ok I think I've got a bit further

~> boot uberjar
Compiling 1/1 closh.zero.frontend.main...
Adding uberjar entries...
Writing project.jar...
Sifting output files...
Writing target dir(s)...

But when running there is another exception. Maybe you recognize this one too?

java -jar target/project.jar gives

Caused by: java.lang.ClassNotFoundException: java.util (more ...)

``` Exception in thread "main" java.lang.ExceptionInInitializerError at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at clojure.lang.RT.classForName(RT.java:2204) at clojure.lang.RT.classForName(RT.java:2213) at clojure.lang.RT.loadClassForName(RT.java:2232) at clojure.lang.RT.load(RT.java:450) at clojure.lang.RT.load(RT.java:426) at clojure.core$load$fn__6548.invoke(core.clj:6046) at clojure.core$load.invokeStatic(core.clj:6045) at clojure.core$load.doInvoke(core.clj:6029) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invokeStatic(core.clj:5848) at clojure.core$load_one.invoke(core.clj:5843) at clojure.core$load_lib$fn__6493.invoke(core.clj:5888) at clojure.core$load_lib.invokeStatic(core.clj:5887) at clojure.core$load_lib.doInvoke(core.clj:5868) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$load_libs.invokeStatic(core.clj:5925) at clojure.core$load_libs.doInvoke(core.clj:5909) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$require.invokeStatic(core.clj:5947) at clojure.core$require.doInvoke(core.clj:5947) at clojure.lang.RestFn.invoke(RestFn.java:457) at closh.zero.frontend.main$loading__6434__auto____181.invoke(main.clj:1) at closh.zero.frontend.main__init.load(Unknown Source) at closh.zero.frontend.main__init.(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at clojure.lang.RT.classForName(RT.java:2204) at clojure.lang.RT.classForName(RT.java:2213) at clojure.lang.RT.loadClassForName(RT.java:2232) at clojure.lang.RT.load(RT.java:450) at clojure.lang.RT.load(RT.java:426) at clojure.core$load$fn__6548.invoke(core.clj:6046) at clojure.core$load.invokeStatic(core.clj:6045) at clojure.core$load.doInvoke(core.clj:6029) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.lang.Var.invoke(Var.java:381) at clojure.lang.Util.loadWithClass(Util.java:250) at closh.zero.frontend.main.(Unknown Source) Caused by: java.lang.ClassNotFoundException: java.util, compiling:(clojure/tools/reader/default_data_readers.clj:1:2) at clojure.lang.Compiler.analyze(Compiler.java:6792) at clojure.lang.Compiler.analyze(Compiler.java:6729) at clojure.lang.Compiler$VectorExpr.parse(Compiler.java:3253) at clojure.lang.Compiler.analyze(Compiler.java:6775) at clojure.lang.Compiler.analyze(Compiler.java:6729) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3881) at clojure.lang.Compiler.analyzeSeq(Compiler.java:7005) at clojure.lang.Compiler.analyze(Compiler.java:6773) at clojure.lang.Compiler.analyze(Compiler.java:6729) at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3813) at clojure.lang.Compiler.analyzeSeq(Compiler.java:7005) at clojure.lang.Compiler.analyze(Compiler.java:6773) at clojure.lang.Compiler.analyze(Compiler.java:6729) at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6100) at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5460) at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4022) at clojure.lang.Compiler.analyzeSeq(Compiler.java:7001) at clojure.lang.Compiler.analyze(Compiler.java:6773) at clojure.lang.Compiler.eval(Compiler.java:7059) at clojure.lang.Compiler.load(Compiler.java:7514) at clojure.lang.RT.loadResourceScript(RT.java:379) at clojure.lang.RT.loadResourceScript(RT.java:370) at clojure.lang.RT.load(RT.java:460) at clojure.lang.RT.load(RT.java:426) at clojure.core$load$fn__6548.invoke(core.clj:6046) at clojure.core$load.invokeStatic(core.clj:6045) at clojure.core$load.doInvoke(core.clj:6029) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invokeStatic(core.clj:5848) at clojure.core$load_one.invoke(core.clj:5843) at clojure.core$load_lib$fn__6493.invoke(core.clj:5888) at clojure.core$load_lib.invokeStatic(core.clj:5887) at clojure.core$load_lib.doInvoke(core.clj:5868) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$load_libs.invokeStatic(core.clj:5925) at clojure.core$load_libs.doInvoke(core.clj:5909) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$require.invokeStatic(core.clj:5947) at clojure.core$require.doInvoke(core.clj:5947) at clojure.lang.RestFn.invoke(RestFn.java:482) at clojure.tools.reader$eval511$loading__6434__auto____512.invoke(reader.clj:9) at clojure.tools.reader$eval511.invokeStatic(reader.clj:9) at clojure.tools.reader$eval511.invoke(reader.clj:9) at clojure.lang.Compiler.eval(Compiler.java:7062) at clojure.lang.Compiler.eval(Compiler.java:7051) at clojure.lang.Compiler.load(Compiler.java:7514) at clojure.lang.RT.loadResourceScript(RT.java:379) at clojure.lang.RT.loadResourceScript(RT.java:370) at clojure.lang.RT.load(RT.java:460) at clojure.lang.RT.load(RT.java:426) at clojure.core$load$fn__6548.invoke(core.clj:6046) at clojure.core$load.invokeStatic(core.clj:6045) at clojure.core$load.doInvoke(core.clj:6029) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invokeStatic(core.clj:5848) at clojure.core$load_one.invoke(core.clj:5843) at clojure.core$load_lib$fn__6493.invoke(core.clj:5888) at clojure.core$load_lib.invokeStatic(core.clj:5887) at clojure.core$load_lib.doInvoke(core.clj:5868) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$load_libs.invokeStatic(core.clj:5925) at clojure.core$load_libs.doInvoke(core.clj:5909) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invokeStatic(core.clj:659) at clojure.core$require.invokeStatic(core.clj:5947) at clojure.core$require.doInvoke(core.clj:5947) at clojure.lang.RestFn.invoke(RestFn.java:457) at closh.zero.reader$loading__6434__auto____183.invoke(reader.clj:1) at closh.zero.reader__init.load(Unknown Source) at closh.zero.reader__init.(Unknown Source) ... 42 more Caused by: java.lang.ClassNotFoundException: java.util at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at clojure.lang.DynamicClassLoader.findClass(DynamicClassLoader.java:69) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at clojure.lang.DynamicClassLoader.loadClass(DynamicClassLoader.java:77) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at clojure.lang.RT.classForName(RT.java:2204) at clojure.lang.RT.classForName(RT.java:2213) at clojure.lang.Compiler.resolveIn(Compiler.java:7280) at clojure.lang.Compiler.resolve(Compiler.java:7243) at clojure.lang.Compiler.analyzeSymbol(Compiler.java:7204) at clojure.lang.Compiler.analyze(Compiler.java:6752) ... 114 more``` ```

</summary>
dundalek commented 5 years ago

From the trace the error occurs in default_data_readers.clj where it tries to load some classes from java.util.

Unfortunately I have no idea why it can't find those classes.

jeroenvandijk commented 5 years ago

I've tried to interact with the exception e.g. by changing the locations of the import of java.util, but no luck either. Giving up for now.

jeroenvandijk commented 5 years ago

Someone else had the same issue. I've tried :quick-merge as deps option, but i get the same error.

jeroenvandijk commented 5 years ago

@dundalek I think I found the main uberjar issue. Tools.reader was included multiple times (and this caused a weird conflict). After excluding tools.reader at different spots things seems to be working: https://github.com/jeroenvandijk/closh/pull/2 I'm not sure though what the jar should do. I'm missing something here :) Maybe you can see what's not working yet?

dundalek commented 5 years ago

Awesome! I will try to look into the prompt issue.

dundalek commented 5 years ago

@jeroenvandijk I was able to fix the prompt issues, rebased your "hack" branch and merged in. This is so great, thank you so much for the help!

jeroenvandijk commented 5 years ago

@dundalek Thank you for the actual work ;-) Glad to contribute a tiny bit! And sorry for the messy commits..