虽然这可能看起来很主观,但我想帮助解决一个具体的例子。这与 Overtone Clojure 库的问题有关 https://github.com/overtone/overtone/issues/274似乎 Leiningen 应该有一个“最佳实践”,并适用于更多的图书馆,而不仅仅是 Overtone。
Overtone 是一个 clojure 库,可以在其他项目中使用。 Overtone 需要本地库才能工作,因此它使用 :native-path "native"
在 project.clj https://github.com/overtone/overtone/blob/master/project.clj#L69为了获得本地 scsynth 库的正确路径 [overtone/scsynth "3.5.7.0"]
使用的。
但是,我相信这会重置依赖于 Overtone 库的项目的传入路径。查看一些背景的问题,但基本上取决于 [overtone "0.9.1"]
在项目中.clj (System/getProperty "java.library.path")
只返回当前的本地路径,使用 Overtone 的项目不能传入任何本地库的路径。
所以,问题是——依赖项目如何将本地原生库与 Overtone 混合? Overtone 或依赖项目是否应该调整其 project.clj 设置?如何?
最佳答案
我不知道“最佳”是什么,但现在至少有四个项目对我来说是一种成功的做法,其中三个是“真正的”商业项目。虽然我只开源了 a specific case for ZeroMQ ,我相信这些原则是通用的,应该适用于任何 native 库。大多数代码也可以很容易地重用,并且它是在 Eclipse 下获得许可的,所以如果你愿意,可以随意使用。我不需要更通用的包含 native 库的版本,但我相信它可以很容易地提取出来。
我对标准解决方案(lein 的 :native-path、JVM args 等)的问题是我想要一个用于 uberjar 分发的可移植解决方案 不需要用户安装任何其他东西 ,因此诸如“下载 uberjar,从包管理器安装 libzmq-dev,然后启动 uberjar”之类的指令是不可能的。
原理很简单:我将本地库捆绑在库 jar 中,适用于所有支持的平台。那样:
我也不依赖任何操作系统链接策略,因为我发现很难让它们可靠地工作。所以我所做的是我包含了所有必需的 native 库,这些 native 库不能保证在 jar 中的运行系统上存在,然后在运行时包含该库:
当然,这种方法也有缺点:
关于clojure - "Best Practice"用于使用 native 库的 clojure 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436744/