gpt4 book ai didi

java - 如何将库解压缩到临时目录,从该目录加载它及其所有依赖项

转载 作者:太空宇宙 更新时间:2023-11-04 04:26:32 24 4
gpt4 key购买 nike

本质上,我想将共享对象的集合压缩到一个 jar 文件中,在运行时将它们解压缩到临时目录,然后从那里加载。比如说我有库:

  • libApp.so
  • libBasicPlugin.so => libApp.so
  • libPlugin1.so => libApp.so、libBasicPlugin.so、libPlugin2.so
  • libPlugin2.so => libApp.so、libBasicPlugin.so

Java 将它们解压到任意唯一的临时目录 $USER_HOME/.my-app/2011_12_05_001/,然后加载 libApp.so,后者又使用 dlopen 加载 libPlugin1 和 libPlugin2(libBasicPlugin 未显式加载)。问题是 libPlugin1 不知道在哪里可以找到 libBasicPlugin 和 libPlugin2。

以下是我尝试/考虑过的各种解决方案:

  1. 在调用 Java 之前,将库放在已知位置并在 sh 文件中设置 LD_LIBRARY_PATH。这可以工作,但不能将库打包到 jar 中
  2. 使用 Java 的 System.load“预加载”依赖项。这是我见过的建议方法,但似乎只有在您事先知道将要加载哪些插件并了解它们的依赖项时才有效。除非您迭代目录中的所有文件,否则加载它们直到不再出现 UnsatisfiedLinkExceptions...
  3. 以某种方式告诉共享对象,它的依赖项将位于同一目录中(通过 DT_RPATH?)。这是我认为在理想世界中我想要的,但似乎您能做的最好的事情就是设置相对于可执行文件的库位置,在本例中为/usr/lib/jvm/.../java。
  4. 静态链接每个库及其依赖项。我担心这会导致 libPlugin2 的两个拷贝(一个动态拷贝和一个静态拷贝),这在过去给我们带来了各种各样的问题。

在 Windows 上,在加载插件之前调用 SetDllDirectory 可以很好地解决这个问题。有什么我忽略/误解的解决方案吗?我的处理方式完全错误吗?

最佳答案

您可以从 Java 进程本身内部设置 LD_LIBRARY_PATH 环境变量。

关于java - 如何将库解压缩到临时目录,从该目录加载它及其所有依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8391161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com