2024 年 Clojure 状态调查中分享您的想法!

欢迎!请查看关于页面以了解此平台的更多信息。

+2
tools.deps

我有一个用于离线 Clojure 项目的用例。我想包含一个捆绑的依赖(在这种情况下是修改过的 Oz 版本,以便离线工作,因此不会获取 JS 依赖)。结果是包含 Oz 所需所有内容的 uberjar。我想从 clj CLI 工具中操作它。我遵循了指南中的说明,并在与 uberjar 相同的位置有一个最小的 deps.edn

{:deps {metasoarous/oz {:local/root "./oz.jar"}}}

在我的理解中,这应该(大致上)等同于调用
java -cp oz.jar clojure.main

没有对 deps.edn 进行任何额外更改,启动 clj 将尝试解决依赖(例如 clojurescript),这是我不想要(实际上,由于网络设置,它们将失败)。

有没有规定的方法可以将 uberjar 只是视作一个哑本地依赖,而不激活 higher order dependency resolution 机制?我想利用 deps.edn 中的选项(例如设置源路径等),只是在一堆预先加载到 uber.jar 中的库(可能是在有限的环境中需要的所有依赖项)

另一种选择(我想)是将它安装到本地的 .m2 并将其视为 Maven 坐标,这样可以(希望)阻止 clj 试图在线嗅探依赖项。
我希望本地 jar 方法可以工作。

1 个答案

+1 投票

当前 clj 没有离线模式,jar 依赖被检查,jar 中的 pom 文件,并且根据该 pom 文件检索依赖。我想如果你创建了一个没有内部 pom 的 uberjar,这可能足够。

你为什么不直接使用java -cp oz.jar clojure.main呢?从我了解的情况来看,在当前场景下,clj 并没有真正提供比那个更多的价值。

一旦东西被整合到uberjar中,tools.deps就无法再与它们做任何有用的事情了——它看起来就像一个巨大的jar文件。版本选择不起作用,在类路径上组合内容不起作用,等等。别名用于修改依赖解决或类路径构建,但这些都会因为uberjar而损坏。uberjar的整个目的是没有任何其他东西。uberjar天生与所有依赖解决和类路径工具格格不入,仅应在构建最终部署应用程序jar时(并且永远不要放入Maven)使用。
相关回答
所以替代方案(我已经用lein做了)是维护一个本地.m2预填充(比如说从原始机器上)所有依赖,然后在隔离箱中将这些拉下来。然后让正常的依赖解决机制启动,而不是通过一个不透明的uberjar包含一组预先解决的依赖。这只是移动气球里的空气——与其打包一个uberjar,不如打包一个单独的.m2存档,并符合tools.deps的期望。或者,将uberjar本身作为本地存档安装到.m2中,并指向该存档(这可能不太道德)。只要我保持在本地.m2中现有的预建立依赖范围内,或者将项目限制为仅使用[本地库](https://clojure.org/guides/deps_and_cli#_using_local_libraries),”  tools.deps应该在实际离线模式下有效地工作,因为它首先从缓存中解析,对吗? 没有东西强迫deps尝试连接到clojars或maven,对吗?
听起来你可能没有uberjar?如果有,jar中不会全是东西吗?因此,不会试图拉入任何缺失的东西吗?
...