它似乎编译得很好,但是当我尝试运行它时,我得到了
错误:无法找到或加载主类_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}))
我错过了什么?
-main
只是一个函数的名称。您的 jar 中可以有大量名为 -main
的函数,每个命名空间最多一个。 :main
键的作用是指定jar文件中manifest的Main-Class
属性,以便java知道如何运行你的程序。所以你必须指定类名,而不是函数名。我已经有一段时间没有这样做了,所以我对细节不是 100%,但我认为既然你使用的是 gen-class,这与你的主命名空间的名称相同,即"helloearth"
。