【问题标题】:lein uberjar - not setting main class properly?lein uberjar - 没有正确设置主类?
【发布时间】:2020-01-03 14:25:00
【问题描述】:

在新的lein new re-frame bc +handler 应用程序上,如果我lein uberjarlein jar 似乎没有正确设置主类。在编译结束时它告诉我

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.

这里是使用re-frame +handler模​​板创建的server.clj和project.clj:

server.clj:

(ns bc.server
  (:require [bc.handler :refer [handler]]
            [config.core :refer [env]]
            [ring.adapter.jetty :refer [run-jetty]])
  (:gen-class))

 (defn -main [& args]
   (let [port (Integer/parseInt (or (env :port) "3000"))]
     (run-jetty handler {:port port :join? false})))

project.clj:

(defproject bc "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.10.1"]
                 [org.clojure/clojurescript "1.10.597"
                  :exclusions [com.google.javascript/closure-compiler-unshaded
                               org.clojure/google-closure-library
                               org.clojure/google-closure-library-third-party]]
                 [thheller/shadow-cljs "2.8.83"]
                 [reagent "0.8.1"]
                 [re-frame "0.10.9"]
                 [compojure "1.6.1"]
                 [yogthos/config "1.1.7"]
                 [ring "1.7.1"]]

  :plugins [
            [lein-shell "0.5.0"]]

  :min-lein-version "2.5.3"

  :source-paths ["src/clj" "src/cljs"]

  :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"]


  :shell {:commands {"open" {:windows ["cmd" "/c" "start"]
                             :macosx  "open"
                             :linux   "xdg-open"}}}

  :aliases {"dev"          ["with-profile" "dev" "do"
                            ["clean"]
                            ["run" "-m" "shadow.cljs.devtools.cli" "watch" "app"]]
            "prod"         ["with-profile" "prod" "do"
                            ["clean"]
                            ["run" "-m" "shadow.cljs.devtools.cli" "release" "app"]]
            "build-report" ["with-profile" "prod" "do"
                            ["clean"]
                            ["run" "-m" "shadow.cljs.devtools.cli" "run" "shadow.cljs.build-report" "app" "target/build-report.html"]
                            ["shell" "open" "target/build-report.html"]]
            "karma"        ["with-profile" "prod" "do"
                            ["clean"]
                            ["run" "-m" "shadow.cljs.devtools.cli" "compile" "karma-test"]
                            ["shell" "karma" "start" "--single-run" "--reporters" "junit,dots"]]}

  :profiles
  {:dev
   {:dependencies [[binaryage/devtools "0.9.11"]]}

   :prod { }

   :uberjar {:source-paths ["env/prod/clj"]
             :omit-source  true
             :main         bc.server
             :aot          [bc.server]
             :uberjar-name "bc.jar"
             :prep-tasks   ["compile" ["prod"]]}
   })

当我lein uberjar 时它确实会生成一个 jar 文件,但是当我尝试运行它时它会出错,告诉我它不包含主类。

我做错了什么?

【问题讨论】:

    标签: clojure clojurescript leiningen


    【解决方案1】:

    您的 uberjar 个人资料在 :prep-tasks 中调用 ["compile" ["prod"]]。您的"prod" 别名调用"clean""target" 列在:clean-targets 中。

    本质上,您的 uberjar 会删除您编译的 Clojure 代码。

    【讨论】:

    • 哎呀,为什么这会是 re-frame lein 模板中的默认行为?要解决这个问题,我应该从 prod 别名中删除 ["clean"] 吗?现在就去试试
    • 我查看了 re-frame-template 项目,你瞧,已经提交了一个现有问题。 github.com/day8/re-frame-template/issues/95
    【解决方案2】:

    你需要告诉 leiningen 哪个命名空间有你的主要功能。在project.clj:

      :main my.service.runner
    

    来自: https://github.com/technomancy/leiningen/blob/master/sample.project.clj#L222

    【讨论】:

    • 在 uberjar 配置文件中它会这样做,不是吗? (编辑:)我将 :main bc.server 行移出 uberjar 配置文件,但它仍然不想包含主要功能
    • 我没有意识到你的项目上有一个滚动条。clj sn-p :-) dpassen 在我上面的回答是正确的。
    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2016-06-18
    • 2016-06-06
    • 2014-06-14
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多