Today I wanted to deploy a ring project with a ClojureScript part.

Deployment is done with an uberjar, which I find effective. I use an additional directory to separate the sources, which are located in src/clj/ns and src/cljs/ns.

So, during the compilation, lein complains it could not locate the namespace:

...FileNotFoundException: Could not locate ns/main__init.class ...


The reason is that the standard content of the source-paths option, which is usually src/ns, is no more suitable. So I changed the uberjar profile in order to specify the different structure of the source directories.

Firstly, the sources-level-down profile shown below replaces the standard content of the source-paths. I found a tip on the Leiningen site to define profiles overrides. It therefore allows to include this kind of source paths only for projects with ClojureScript:

Once, in the ~/.lein/profiles.clj file:

:sources-level-down {:source-paths ^:replace ["src/clj" "src/cljs"]}

:uberjar-common {:aot :all
<other options>}
:uberjar-additional {} ; nothing by default

In every ClojureScript projects, in their project.clj file:
; overrides profile to include new source-path definition

No doubt a hook can be added to the workflow, but in the meantime I recommend using cuttle defined itself as an User Interface for the ClojureScript Compiler, to keep an eye on the JS compilation status.