无法使用 deps.edn 和 build.clj 制作 uberjar

问题描述 投票:0回答:1

它似乎编译得很好,但是当我尝试运行它时,我得到了

错误:无法找到或加载主类_main 引起原因:java.lang.ClassNotFoundException:_main

我将其归结为这些文件:

helloearth.clj

(ns helloearth
    (:gen-class))

(defn -main
    [& args]
    (println "Hello Earth"))

deps.edn

{; project paths
 :paths ["src"]

 :deps {
        org.clojure/clojure {:mvn/version "1.12.0"}
        }
 :aliases {
           ;; Run with clj -T:build function-in-build
           :build {:deps {io.github.clojure/tools.build {:git/tag "v0.10.6" :git/sha "52cf7d6"}}
                   :ns-default build}
           }}

构建.clj

(ns build
    (:require [clojure.tools.build.api :as b]))

(def lib 'helloearth/helloearth)
(def version (format "1.2.70"))
(def class-dir "target/classes")
(def uber-file (format "target/%s-%s-standalone.jar" (name lib) version))

;; delay to defer side effects (artifact downloads)
(def basis (delay (b/create-basis {:project "deps.edn"})))

(defn clean [_]
      (b/delete {:path "target"}))

(defn uber [_]
      (clean nil)
      (b/copy-dir {:src-dirs ["src"]
                   :target-dir class-dir})
      (b/write-pom {:class-dir class-dir
                    :lib       lib
                    :version   "1.0.0"
                    :basis     basis
                    :src-dirs  (:paths basis)})
      (b/compile-clj {:basis @basis
                      ;:ns-compile '[clock2.main]
                      :src-dirs (:paths basis)
                      :class-dir class-dir})
      (b/uber {:class-dir class-dir
               :uber-file uber-file
               :basis basis
               :main '-main}))

我错过了什么?

build clojure deps-edn
1个回答
0
投票

-main
只是一个函数的名称。您的 jar 中可以有大量名为
-main
的函数,每个命名空间最多一个。
:main
键的作用是指定jar文件中manifest的
Main-Class
属性,以便java知道如何运行你的程序。所以你必须指定类名,而不是函数名。我已经有一段时间没有这样做了,所以我对细节不是 100%,但我认为既然你使用的是 gen-class,这与你的主命名空间的名称相同,即
"helloearth"

© www.soinside.com 2019 - 2024. All rights reserved.