首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用原生库的clojure库的“最佳实践”?

使用原生库的clojure库的“最佳实践”?
EN

Stack Overflow用户
提问于 2014-01-30 00:22:44
回答 3查看 1.6K关注 0票数 22

虽然这可能看起来很主观,但我想要帮助解决一个具体的例子。这与Overtone Clojure库https://github.com/overtone/overtone/issues/274的一个问题有关,它似乎应该有一个适用于Leiningen的“最佳实践”,并适用于更多的库,而不仅仅是Overtone。

Overtone是一个clojure库,可以在其他项目中使用。Overtone需要本地库才能工作,因此它在project.clj https://github.com/overtone/overtone/blob/master/project.clj#L69中使用:native-path "native",以便为所使用的本机scsynth库[overtone/scsynth "3.5.7.0"]获取正确的路径。

但是,我认为这会重置依赖Overtone库的项目的传入路径。请看这个问题的一些背景,但基本上在依赖于project.clj中的[overtone "0.9.1"]之后,(System/getProperty "java.library.path")只返回当前的本机路径,并且使用Overtone的项目不能传递到任何本地库的路径。

因此,问题是--依赖项目如何将本地本地库与Overtone混合在一起?Overtone或dependent-project是否应该调整其project.clj设置?多么?

EN

回答 3

Stack Overflow用户

发布于 2015-01-19 01:37:23

我不知道什么是“最好的”,但现在至少有四个项目对我来说是成功的,其中三个是“真正的”商业项目。虽然我只开源了a specific case for ZeroMQ,但我相信这些原则是通用的,应该适用于任何本地库。大多数代码也可以很容易地重用,而且它是在Eclipse下获得许可的,所以如果您愿意,请随意使用。我不需要更通用的本机版本--包括库,但我相信它可以很容易地提取出来。

我在标准解决方案(lein :native-path、JVM args等)中遇到的问题我想为uberjar发行版提供一个便携的解决方案,它不需要用户安装任何其他的,所以像“下载uberjar,从你的包管理器安装libzmq-dev,然后启动uberjar”这样的指令是不可能的。

原则非常简单:对于所有支持的平台,我将本地库捆绑在库jar中。这样的话:

  • I作为库的作者,专门控制所使用的版本。毫不奇怪,来自另一个项目的库可以在没有任何意识到库依赖于本地libs.
  • Similarly,uberjar发行版的情况下完成,无论是来自leiningen还是maven,都可以无缝地工作。

我也不依赖任何操作系统链接策略,因为我发现很难让它们可靠地工作。因此,我所做的是,我包含了所有必需的本地库,这些库不能保证存在于jar中正在运行的系统中,然后在运行时包含库:

  • 动态找出它在哪个平台上运行;如果系统特定的临时目录中还没有本机库,
  • 会将其从自己的归档中提取出来(基于SHA;这对于避免在没有正确清理其临时目录的平台上积累是必要的--即,

以正确的顺序加载本机依赖项,因此动态链接不会尝试解析主机操作系统路径上的库。

当然,这种方法也有缺点:

由于单个工件的构建过程涉及三种不同的库(我支持Linux,Windows和OSX)和两种架构(& x86_64),构建过程很难自动化,并且需要访问相关的machines;

  • Because本地库。在安全敏感的环境中,本地库的特定版本是捆绑的,库用户无法更新它们;在安全敏感的环境中,这可能是unacceptable;
  • As这个库的用户,你必须相信我,捆绑的本地库确实是我所说的那样,并且确实是通过我在源代码中描述的过程构建的,没有任何更多的篡改;
  • 因为我对链接动态库几乎一无所知,所以这种方法可能还有其他问题,尽管它们还没有让我上钩。
票数 3
EN

Stack Overflow用户

发布于 2014-05-23 02:42:50

我通过Clojars发布了clj-nativedep,它可以帮助解决这个问题。该库提供了快速识别当前系统体系结构的规范化名称的能力,并且可以将任何选定的资源(在jar或类路径中)加载到运行时环境中。

请参阅:https://github.com/rritoch/clj-nativedep

这个系统是专门为我的WarpCTL项目制作的,该项目利用了swig生成的大量本机代码。由于Clojure类加载的处理方式,本地依赖项需要通过静态类构造函数加载,您可以在https://github.com/rritoch/WarpCTL/blob/master/extra/JADL-SDK/build/java/src/com/vnetpublishing/swig/adl/jadl_sdk.java#L13上看到一个示例。对于该项目,我将java代码构建到JAR中,并添加clj-nativedep和jar作为依赖项。应该可以通过这种方式从纯clojure应用程序加载资源,但为了获得最佳性能,需要从静态类构造函数加载资源。

票数 2
EN

Stack Overflow用户

发布于 2015-05-27 01:46:44

我也遇到过这个问题,所以我做了一个非正统的lein插件,只需在project.clj中添加几行代码就可以一劳永逸地解决这个问题:https://bitbucket.org/noncom/nativot

警告:它极不受Clojure方式的欢迎,因为它打破了所有可重复性的概念,允许您将任意的jar、资源和其他文件打包到结果jar中,并使其正常工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21436744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档