I have developed over 30 Clojure projects, but this is my first foray into Clojurescript. I built a SPA using re-frame and now I am attempting to create the uberjar for it. When I run lein uberjar
, I get the following error message:
Warning: The Main-Class specified does not exist within the jar. It may not be executable as expected. A gen-class directive may be missing in the namespace which contains the main method, or the namespace has not been AOT-compiled.
I've setup the server-side section of the project.clj
similar to other Clojure projects.
- All server-side source files are located in
src/clj
. - All Clojurescript source files are located in
src/cljs
main
is located in a fileserver_core.clj
, which resides insrc/clj/ordering
.(:gen-class)
is present inserver_core.clj
.The
-main
exists withinserver_core.clj
:(defn -main [& args] (main))
project.clj
includes the following directive for the uberjar::uberjar {:aot :all :source-paths ["src/clj"] :env {:production true} :main ordering.server-core :hooks [leiningen.cljsbuild]}}
The
main
andtarget-path
directives inproject.clj
are as follows::main ^:skip-aot ordering.server-core :target-path "target/%s")
I would like to create this uberjar to include in the Dockerfile as I do with other Clojure projects.
UPDATE: ADD project.clj
(defproject ordering "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.9.0"]
[org.clojure/clojurescript "1.10.238"]
[org.clojure/core.async "0.4.474"]
;; clojurescript 3rd party
[re-frame/re-frame "0.10.5"]
[day8.re-frame/test "0.1.5"]
[day8.re-frame/http-fx "0.1.6"]
[re-frame-datatable "0.6.0"]
[com.rpl/specter "1.1.1"]
[cljsjs/firebase "3.5.3-0"]
[reagent "0.8.0"]
[expound "0.6.0"]
[metosin/reitit "0.1.1-SNAPSHOT"]
[metosin/reitit-ring "0.1.1-SNAPSHOT"]
[metosin/reitit-spec "0.1.1-SNAPSHOT"]
[metosin/muuntaja "0.5.0"]
[cljs-ajax "0.7.3"]
[re-com "2.1.0"]
[garden "1.3.5"]
[ring-logger-timbre "0.7.5"]
[ring/ring-jetty-adapter "1.6.2"]
;; common
[clj-time "0.13.0"]
[cheshire "5.7.1"]
[com.taoensso/timbre "4.10.0"]
[commons-codec/commons-codec "1.11"]
;; google
[com.google.cloud/google-cloud-storage "1.27.0"]
[com.google.firebase/firebase-admin "6.0.0"]
[ns-tracker "0.3.1"]]
:plugins [[lein-cljsbuild "1.1.7"]
[lein-garden "0.3.0"]
[lein-ring "0.9.7"]]
:ring {:init ordering.server-core/init
:destroy ordering.server-core/destroy
:handler ordering.handler/app
:auto-reload? true
:port 3000
:nrepl {:start? true}}
:min-lein-version "2.5.3"
:source-paths ["src/cljs" "src/clj"]
:test-paths ["test/cljs" "test/clj"]
:clean-targets ^{:protect false} ["resources/public/js/compiled" "target"
"test/js"
"resources/public/css"]
:figwheel {:css-dirs ["resources/public/css"]}
:garden {:builds [{:id "screen"
:source-paths ["src/styles"]
:stylesheet ordering.screen/screen
:compiler {:output-to "resources/public/css/screen.css"
:pretty-print? true}}]}
:prep-tasks [["garden" "once"]]
:repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}
:profiles
{:dev
{:dependencies [[fipp/fipp "0.6.12"]
[binaryage/devtools "0.9.10"]
[figwheel-sidecar "0.5.16"]
[re-frisk "0.5.4"]
[com.cemerick/piggieback "0.2.2"]
[doo "0.1.10"]
[javax.servlet/servlet-api "2.5"]
[clj-http "3.9.0"]
[ring/ring-mock "0.3.1"]]
:plugins [[lein-figwheel "0.5.16"]
[lein-doo "0.1.10"]]
}
:hooks [leiningen.cljsbuild]
:uberjar {:aot :all
:source-paths ["src/clj"]
:env {:production true}
:main ordering.server-core
:hooks [leiningen.cljsbuild]}}
:cljsbuild
{:builds
[{:id "dev"
:source-paths ["src/cljs"]
:figwheel {:on-jsload "ordering.core/mount-root"}
:compiler {:main ordering.core
:closure-defines {"goog.DEBUG" true
"clairvoyant.core.devmode" true}
:output-to "resources/public/js/compiled/dev/app.js"
:output-dir "resources/public/js/compiled/dev/out"
:asset-path "js/compiled/dev/out"
:source-map-timestamp true
:preloads [devtools.preload
re-frisk.preload]
:external-config {:devtools/config {:features-to-install :all}}
}}
{:id "min"
:source-paths ["src/cljs"]
:compiler {:main ordering.core
:output-to "resources/public/js/compiled/app.js"
:output-dir "resources/public/js/compiled/out"
:optimizations :advanced
:asset-path "js/compiled/out"
:closure-defines {goog.DEBUG false}
:pretty-print false}}
{:id "test"
:source-paths ["src/cljs" "test/cljs"]
:compiler {:main ordering.runner
:output-to "resources/public/js/compiled/test.js"
:output-dir "resources/public/js/compiled/test/out"
:optimizations :none}}
]}
:doo {:build "test"
:alias {:default [:chrome]}}
:main ^:skip-aot ordering.server-core
:target-path "target/%s")
project.clj
Any other thoughts? – frankskip-aot
? – Svante