TL;DR: I reverted all the launcher changes I did.
2.6.0 now behaves as
2.4.33 and previous releases again.
As described in my previous post I intended to rewrite the
shadow-cljs launcher to get rid of some long standing “issues” and gaining access to some new features such as updating
:dependencies without restarting.
As it turns out however I traded one set of problems for another set of problems which were actually way worse and much harder to solve.
Turns out that dynamically loading dependencies is really hard when working with Java deps. It all worked fine when using pure ClojureScript deps with basically only
.cljs files and maybe a
.clj macro file sprinkled in there. When you however add a Clojure library that had some Java dependencies things started breaking quickly with weird
java.lang.NoClassDefFoundError although they were clearly on the classpath. Problem of course was my naive handling of ClassLoaders but when switching to a more sophisticated approach that isolated the ClassLoaders properly I basically lost all the benefits I was hoping to gain. Startup time got worse too.
I also tried switching to the
tools.deps.alpha library over
pomegranate. Both resolve
maven dependencies but do so slightly differently so it sometimes broke builds that were working fine previously. Dealing with that while also dealing the classloader issues made things rather annoying.
CI also got way harder since it now just wasn’t just about
npm install shadow-cljs but also properly caching the
~/.shadow-cljs folder so the launcher didn’t have to be downloaded for each CI run.
I will keep exploring the options but I decided to revert the changes for now since leaving a less reliable launcher online didn’t help anyone. For now things are back to the way they were before.