如何在Leiningen中仅将指定依赖打包至输出Jar文件
解决Leiningen仅打包指定依赖到Uberjar的问题
要实现仅将com.github.freeze-dolphin/clamp打包进Uberjar,同时排除其他三个provided级别的依赖,你需要调整project.clj的配置,利用Leiningen的profile和依赖scope机制,具体方案如下:
正确配置示例
(defproject dumortierite "0.1.0-SNAPSHOT" ;; 保留其他原有配置(如:source-paths、:main等) :dependencies [[com.github.freeze-dolphin/clamp "4ddd923dcb"]] :profiles { :dev { ;; 开发环境所需的依赖,仅在本地开发时生效(如repl、测试) :dependencies [ [org.clojure/clojure "1.11.1"] [io.papermc.paper/paper-api "1.19.3-R0.1-SNAPSHOT"] [com.github.StarWishsama/Slimefun4 "2023.02"] ] } :provided { ;; 标记为provided的依赖,运行时由宿主环境(如PaperMC服务器)提供 :dependencies [ [org.clojure/clojure "1.11.1" :scope "provided"] [io.papermc.paper/paper-api "1.19.3-R0.1-SNAPSHOT" :scope "provided"] [com.github.StarWishsama/Slimefun4 "2023.02" :scope "provided"] ] } } ;; 关键配置:让uberjar任务激活:provided profile,自动排除该profile下的依赖 :uberjar {:profiles [:provided]} )
配置说明
- 主依赖项:仅保留需要打包的
clamp,默认compilescope,会被自动包含进Uberjar。 - :dev Profile:存放开发时需要的依赖,确保本地开发(如
lein repl、lein test)正常运行,不影响最终打包结果。 - :provided Profile:将运行时由宿主环境提供的依赖标记为
:scope "provided",Leiningen会自动排除这类依赖的打包。 - :uberjar 配置:通过
:profiles [:provided]指定构建Uberjar时激活该profile,确保provided依赖被正确识别和排除。
常见问题解释
- 之前执行
jar命令无依赖:lein jar仅打包项目自身代码,不会包含任何依赖,若需打包依赖必须使用lein uberjar。 - 之前
uberjar包含全部依赖:未正确激活:providedprofile,导致Leiningen将这些依赖视为compilescope,从而打包进Uberjar。
备选方案(直接排除)
如果不想使用profile,也可以通过:uberjar-exclusions直接指定要排除的依赖,但这种方式需要手动编写匹配规则,灵活性较差:
:uberjar-exclusions [#"org/clojure/clojure.*" #"io/papermc/paper.*" #"com/github/StarWishsama/Slimefun4.*"]
内容的提问来源于stack exchange,提问作者Freeze Dolphin
相关产品推荐
相关产品推荐

