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的uberjar,这可能就足够了。

为什么不直接做java -cp oz.jar clojure.main?据我所知,在这个场景中,clj没有提供额外的价值。


编辑
我希望理论值是类路径管理、脚本等。  管理源路径、利用别名等。  基本上是最小路径和(非Maven)依赖设置事项(例如本地文件依赖项、git依赖项等)。  我将回退到手动路径和依赖项  管理+脚本。
如果你使用uberjar,那么这些功能都不适用吗?

编辑
不在uberjar中的内容肯定适用。  文件依赖项、git相关内容、别名。  也不需要任何互联网连接,但可能通过本地解析在一个相对孤立的盒子上链接。  Uberjar使得将oz的依赖项本地化变得既简单又方便。  我过去使用lein offline做这件事情,还可以(仍然有点笨拙)。  clj当时看起来像是一个更好的解决方案,而不是像胶带一样将类路径生成、文件依赖项、本地jar和可选的加载与脚本以及各种load-file网页一起塞在一起。  觉得tools.deps可以简化事情。
一旦项目被打包成uberjar,tools.deps就再也无法对它们进行任何有意义的操作了——它看起来就像一个巨大的工件。版本选择不起作用,在类路径上组合内容也不起作用等。别名用于修改依赖解析或类路径构建,但这些功能在uberjar中都是无效的。uberjar的整体目的是没有其他内容。uberjar与所有依赖解析和类路径工具存在内在矛盾,因此只有在构建部署最终应用程序jar时才应使用它们(并且绝不要将其放入Maven中)。
因此,替代方法(我已经使用lein完成)是维护一个本地.m2目录,其中包含所有依赖项(例如,来自原始机器),并将其拉到隔离的框中。然后让正常的依赖解析机制启动,而不是通过透明的uberjar包含一大堆预解析的依赖。这只是一种在气球周围移动空气的做法——而不是打包一个uberjar,而是打包一个单rail的.m2存档,并符合tools.deps的期望。或者,将uberjar本身安装为本地 artifact 到 .m2,并将deps指向它(或许有些不妥)。只要我停留在本地.m2中现有的预存在依赖项的宇宙中,或者将项目限制为仅使用[本地库](https://clojure.org/guides/deps_and_cli#_using_local_libraries), tools.deps应该在脱机模式下有效工作,因为它首先从缓存中进行解析,对吗?不应该是任何东西都迫使deps尝试连接到clojars或maven,对吗?
听起来你可能没有uberjar?如果是这样,jar里不都应该有东西吗?所以不会去拉任何缺失的东西?
...