我已经开发了 30 多个 Clojure 项目,但这是我第一次涉足 Clojurescript。我使用 re-frame 构建了一个 SPA,现在我正在尝试为它创建 uberjar。当我运行时lein uberjar
,我收到以下错误消息:
警告:指定的 Main-Class 在 jar 中不存在。它可能无法按预期执行。包含 main 方法的命名空间中可能缺少 gen-class 指令,或者命名空间尚未经过 AOT 编译。
project.clj
我已经设置了与其他 Clojure 项目类似的服务器端部分。
- 所有服务器端源文件都位于
src/clj
. - 所有 Clojurescript 源文件都位于
src/cljs
main
位于一个文件中server_core.clj
,该文件位于src/clj/ordering
.(:gen-class)
存在于server_core.clj
.-main
存在server_core.clj
于:(defn -main [& args] (main))
project.clj
包括以下用于 uberjar 的指令::uberjar {:aot :all :source-paths ["src/clj"] :env {:production true} :main ordering.server-core :hooks [leiningen.cljsbuild]}}
中的
main
andtarget-path
指令project.clj
如下::main ^:skip-aot ordering.server-core :target-path "target/%s")
我想创建这个 uberjar 以包含在 Dockerfile 中,就像我对其他 Clojure 项目所做的那样。
更新:添加 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")