(defproject dumortierite "0.1.0-SNAPSHOT"
;; omitted...
:dependencies [
[com.github.freeze-dolphin/clamp "4ddd923dcb" :scope "compile"]
[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"]
])
我已经添加了 4 个依赖项,我只想包含
[com.github.freeze-dolphin/clamp "4ddd923dcb" :scope "compile"]
如果使用
lein uberjar
,它将在罐子中包含所有这 4 个部门。
我知道这可以通过在
shade
中使用maven
来完成,但是如何在leiningen
中使用?
我试过以下:
:dependencies [[com.github.freeze-dolphin/clamp "4ddd923dcb"]]
:profiles {:dev
{:dependencies
[
[com.github.freeze-dolphin/clamp "4ddd923dcb" :scope "compile"]
]}
:provided
{: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"]
]}}
但是在
jar
中,没有包含任何部门。uberjar
中,一切都包含...
你刚刚发现了
jar
和uberjar
之间的区别。 JAR 文件仅包含项目中的代码。 uberjar
文件之所以如此命名,是因为它包含您的项目代码和所有依赖项的代码。这使得部署到网络服务器变得更容易,例如,因为所有代码都包含在一个文件中。
大多数项目总是使用
uberjar
。唯一你不会使用 uberjar 的情况是你已经有一个运行的网络服务器已经加载了所需的依赖文件。这对于简单的任务来说并不常见。
作为一种解决方法,您可以在
:uberjar-exclusions
中使用 project.clj
以及将用于匹配项目中的文件名的正则表达式向量。任何匹配都会导致文件 not 被打包到 Uberjar 中。
我在具有以下依赖项的示例项目上对其进行了测试:
:dependencies [[org.clojure/clojure "1.11.1" :scope "provided"]
[commons-codec/commons-codec "1.15"]]
为了从 Uberjar 中排除
commons-codec
中的文件,我使用了:
:profiles {:uberjar {:aot :all
:uberjar-exclusions [#"org/apache/commons/codec"
#"META-INF/maven/commons-codec"]
:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}}
原始示例在 Leiningen 的sample project.clj中。