You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_core
    
    如果能看到ordering/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:39:01