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 仅作为哑本地依赖项对待,而不介入更高级别的依赖项解析机?我希望利用 deps.edn 中的选项(例如,设置源路径等),只是在一大批预先加载到 uber.jar 中的库中(假设是一个有限环境中所需要的所有依赖项)。

另一个选择(我想)是将它安装到本地的 .m2 中,将其作为 Maven 坐标处理,这应该(希望)防止 clj 尝试在线检测依赖项。
我希望本地 jar 方法能够正常工作。

1 答案

+1

目前没有为 clj 实现“离线”模式,jar 依赖项会被检查,jar 内部的 pom 会找到,并根据该 pom 检索依赖项。我认为如果你产生一个没有内部 pom 的 uberjar,可能就足够了。

为何您不直接使用 java -cp oz.jar clojure.main?在这种情况下,根据我在此场景中的了解,clj 实际上没有提供任何额外价值。


编辑
我希望理论上的值将是类路径管理、脚本编程等。 管理源路径、利用别名等。 基本上是最低路径和(非Maven)依赖设置,比如本地文件依赖、git依赖等。 我将回退到手动路径和依赖管理以及脚本。
如果你在用uberjar,那么这些特性都不适用吗?

编辑
不在uberjar中的那些内容肯定适用。 文件依赖、git内容、别名。 也不需要任何互联网连接,但可能通过相对隔离的盒子的本地解析进行链接。 Uberjar使oz的依赖项在本地机器上的部署既简单又本地化。 我以前使用lein offline做这件事,还不错(依然有点笨拙)。 clj当时看起来是一个更好的解决方案,而不是通过胶带将类路径生成、文件依赖、本地jar和可选加载与脚本以及各种加载文件网站结合在一起。 我当时相当想工具.dep可以简化一些事情。
将组件合并到uberjar之后,tools.deps就不能再对它们做任何有意义的操作了——它们看起来就像一个巨大的工件。版本选择不起作用,在类路径上合并组件也不起作用,等等。别名列用于修改依赖解析或类路径构建,但这些都是在uberjar中被破坏的。uberjar的整个意义在于没有其他东西。uberjar与所有的依赖解析和类路径工具都存在矛盾,只应该在构建用于部署的最终应用程序jar时使用(且永远不要放在Maven中)。
所以一种备选方案(我用lein进行过)是维护一个本地.m2预填充(比如从原始机器获取),将所有依赖项拉到隔离箱上。然后让常规的依赖解析机制启动,而不是通过一个不透明的uberjar包括大量预解析的依赖项。这只是在进行气球中的空气传递——与其打包一个单独的uberjar,不如打包一个单独的.m2存档,并符合tools.deps的预期。或者,将uberjar本身作为本地工件安装到.m2中,并将deps指向它(可能不太合适)。只要我保持在本地.m2中预先存在的依赖项的宇宙内,或者将项目委托给只使用[本地库](https://clojure.org/guides/deps_and_cli#_using_local_libraries),  tools.deps应该有效地在离线模式下工作,因为它首先从缓存中解析,对吗? deps不应该被强制尝试连接到clojars或maven,对吗?
听起来你可能没有uberjar?如果有,jar里面不就都有了所有东西吗?那么它不会尝试拉入任何缺失的东西了吗?
...