2024 Clojure状况调查中分享你的想法!

欢迎!请查看关于页面来了解更多关于如何使用本网站的信息。

0投票
Clojure

类似于 CLJ-843,由于成功地将其加载到错误的类加载器中(谢谢SUN!),无法调用 (System/load "/tmp/a.so")

在尝试创建一种简单的加载嵌入在uberjars中的共享对象(使用 https://github.com/adamheinrich/native-utils/blob/master/src/main/java/cz/adamh/utils/NativeUtils.java)的方法时,我发现由于类加载器问题,这是不可能的。

有什么想法吗?

3个答案

0投票

评论由:alexmiller

那个链接的jira有一个补丁并已合并,所以它似乎已经存在,作为(clojure.lang.RT/loadLibrary "/tmp/a.so")?

0投票

评论由:shlomi

亚历克斯,
抱歉没有解释清楚。

(clojure.lang.RT/loadLibrary "/tmp/a.so") - 不工作,loadLibrary期望在LD_LIBRARY_PATH或java.library.path指向的路径下存在适当命名的库文件。例如,如果LD_LIBRARY_PATH上有liba.so文件,则(clojure.lang.RT/loadLibrary "a")将工作。

对于不需要依赖环境设置或.so文件预先存在的用例,您可以替代使用System/load来使用System/loadLibrary。例如,如果您想从正在运行的Clojure程序中下载某些平台的适当.so文件,或者将.so文件放置在jar文件中。在这些情况下,您可以从jar中下载或提取它们,分别放入某个临时文件夹(该文件夹不在LD_LIBRARY_PATH中),然后使用它们的完整路径来加载,在运行程序中使用它们(即无需特殊脚本或准备任务)。

如果我要为src/jvm/clojure/lang/RT.java编写一个补丁,它将是

// 在系统类加载器中而不是Clojure自带的库中,从任何地方加载一个库
public static void loadObject(String libFullPath){

System.load(libFullPath);

}

0投票
参考: https://clojure.atlassian.net/browse/CLJ-2243(由alex+import报告)
...