Clojure+re-frame项目打包uberjar遇Main-Class不存在警告求助
解决Leiningen Uberjar中Main-Class不存在的警告
你遇到的这个警告核心问题在于全局配置中的^:skip-aot元数据阻止了你的服务端主namespace被AOT编译——即使你在uberjar profile里设置了:aot :all,这个元数据的优先级更高,导致最终的jar包中没有生成对应的class文件,Leiningen找不到Main-Class。
下面是具体的修复步骤:
1. 调整全局:main配置,移除^:skip-aot元数据
打开你的project.clj,找到全局的:main行:
:main ^:skip-aot ordering.server-core :target-path "target/%s")
修改为:
:main ordering.server-core :target-path "target/%s")
这样默认情况下主namespace会被AOT编译,我们可以在dev profile中单独设置^:skip-aot(因为开发环境不需要AOT编译)。
2. 在Dev Profile中添加^:skip-aot(可选但推荐)
找到:dev profile的配置,添加:main ^:skip-aot ordering.server-core,确保开发环境不会对主namespace进行AOT编译:
:dev { :dependencies [[fipp/fipp "0.6.12"] [binaryage/devtools "0.9.10"] ...] :plugins [[lein-figwheel "0.5.16"] [lein-doo "0.1.10"]] :main ^:skip-aot ordering.server-core ; 新增这一行 }
3. (可选)优化Uberjar的AOT配置
如果你不想编译所有clj代码,可以把uberjar profile中的:aot :all改成明确指定需要AOT的namespace,这样打包速度更快:
:uberjar { :aot [ordering.server-core] ; 替换原来的:aot :all :source-paths ["src/clj"] :env {:production true} :main ordering.server-core :hooks [leiningen.cljsbuild] }
4. 验证修复效果
执行以下步骤确认问题解决:
- 先清理之前的构建产物:
lein clean - 重新构建uberjar:
lein uberjar - 检查jar包中是否包含主class文件:
如果能看到jar tf target/uberjar/ordering-0.1.0-SNAPSHOT-standalone.jar | grep ordering/server_coreordering/server_core.class(以及相关的class文件),说明AOT编译成功,警告应该消失了。
额外检查点
- 确认你的
src/clj/ordering/server_core.clj中正确声明了namespace和:gen-class:(ns ordering.server-core (:gen-class) ;; 其他require ) - 确认
-main函数的签名正确:(defn -main [& args] (main)) ; 这里的main是你实际的启动函数
这样修改后,你的uberjar应该能正常生成,并且可以像其他Clojure项目一样在Docker中使用了。
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

