0
votes

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 file server_core.clj, which resides in src/clj/ordering.
  • (:gen-class) is present in server_core.clj.
  • The -main exists within server_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 and target-path directives in project.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")
1
Could be nothing, but seems like the namespace of server-core based on the location of server_core.clj would be "ordering". But the :main in the :uberjar profile points to "annotation-client.server-core". Could that be an issue?jas
@jas, you are correct. I had typed them incorrectly in the SO post. I have updated to reflect the correct names. I added the full project.clj Any other thoughts?frank
Why skip-aot?Svante

1 Answers

0
votes

I'm not sure about the cause of your specific problem, but I also just recently started using CLJS and created a template project that works with both the doo testing framework & figwheel.

~/expr/cljs-template > lein doo phantom test once

;; ======================================================================
;; Testing with Phantom:

doorunner - beginning
doorunner - end

Testing tst.flintstones.dino
Beginning dino tests...
globalObject:   #js {:a 1, :b 2, :c 3}
(-> % .-b (+ 5) => 7
(js/makeDino) => #js {:desc blue dino-dog, :says #object[Function]}
dino.desc =>  blue dino-dog
dino.says(5) =>  Ruff-Ruff-Ruff-Ruff-Ruff!
Finished dino tests...

Testing tst.flintstones.wilma
Beginning wilma tests...
Finished wilma tests...
Beginning wilma tests...
wilmaPhony/stats:    #js {:lipstick red, :height 5.5}
wilma => #js {:desc patient housewife, :says #object[Function]}
Finished wilma tests...

Testing tst.flintstones.pebbles
Beginning pebbles tests...
Finished pebbles tests...

Ran 5 tests containing 10 assertions.
0 failures, 0 errors.

It also works with lein uberjar:

~/expr/cljs-template > lein uberjar
Created /home/alan/expr/cljs-template/target/flintstones-0.1.0-SNAPSHOT.jar
Created /home/alan/expr/cljs-template/target/flintstones-0.1.0-SNAPSHOT-standalone.jar

You may be able to spot the difference vs your project by eye, or you could incrementally paste in your code with frequent pauses for lein clean; lein uberjar to see when something new causes it to fail. Be sure to do the clean step whenever in doubt, and also every time you change project.clj, or else old build artifacts could really muck things up.

I would be interested in what you discover as the cause.