0

我已经开发了 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]}}
    
  • 中的mainandtarget-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")
4

1 回答 1

0

我不确定您的具体问题的原因,但我最近也刚刚开始使用 CLJS 并创建了一个模板项目,该项目可与doo测试框架和无花果轮一起使用。

~/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.

它也适用于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

您可能能够通过肉眼发现与您的项目之间的差异,或者您可以通过频繁的暂停逐步粘贴代码,lein clean; lein uberjar以查看新事物何时导致它失败。务必clean在有疑问时执行此步骤,并且每次更改时也要执行此步骤project.clj,否则旧的构建工件可能真的会把事情搞砸。

我会对你发现的原因感兴趣。

于 2018-05-14T06:47:01.767 回答