虽然这可能看起来很主观,但我想要帮助解决一个具体的例子。这与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设置?多么?
发布于 2015-01-19 01:37:23
我不知道什么是“最好的”,但现在至少有四个项目对我来说是成功的,其中三个是“真正的”商业项目。虽然我只开源了a specific case for ZeroMQ,但我相信这些原则是通用的,应该适用于任何本地库。大多数代码也可以很容易地重用,而且它是在Eclipse下获得许可的,所以如果您愿意,请随意使用。我不需要更通用的本机版本--包括库,但我相信它可以很容易地提取出来。
我在标准解决方案(lein :native-path、JVM args等)中遇到的问题我想为uberjar发行版提供一个便携的解决方案,它不需要用户安装任何其他的,所以像“下载uberjar,从你的包管理器安装libzmq-dev,然后启动uberjar”这样的指令是不可能的。
原则非常简单:对于所有支持的平台,我将本地库捆绑在库jar中。这样的话:
我也不依赖任何操作系统链接策略,因为我发现很难让它们可靠地工作。因此,我所做的是,我包含了所有必需的本地库,这些库不能保证存在于jar中正在运行的系统中,然后在运行时包含库:
以正确的顺序加载本机依赖项,因此动态链接不会尝试解析主机操作系统路径上的库。
当然,这种方法也有缺点:
由于单个工件的构建过程涉及三种不同的库(我支持Linux,Windows和OSX)和两种架构(& x86_64),构建过程很难自动化,并且需要访问相关的machines;
发布于 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应用程序加载资源,但为了获得最佳性能,需要从静态类构造函数加载资源。
发布于 2015-05-27 01:46:44
我也遇到过这个问题,所以我做了一个非正统的lein插件,只需在project.clj中添加几行代码就可以一劳永逸地解决这个问题:https://bitbucket.org/noncom/nativot
警告:它极不受Clojure方式的欢迎,因为它打破了所有可重复性的概念,允许您将任意的jar、资源和其他文件打包到结果jar中,并使其正常工作。
https://stackoverflow.com/questions/21436744
复制相似问题