我想将我的应用程序作为独立的 jar 文件发布。 jar 文件应该包含所有的类文件,以及两个共享库。其中一个共享库是为 JNI 编写的,本质上是对另一个共享库(100% C)的间接访问。
我首先尝试在没有库的情况下运行我的 jar 文件,但可以通过 LD_LIBRARY_PATH 环境变量访问它们。效果很好。
然后我将 JNI 库放入 jar 文件中。我读过有关通过先将 jar 文件复制到某个临时目录来从 jar 文件加载库的信息,这对我来说效果很好(请注意,我想 100% C 库是像以前一样加载的)。
现在我想将两个库都放入 jar 中,但我不明白如何才能确保它们都被加载。当然我可以将它们都复制到一个临时目录,但是当我加载“间接”目录时,它总是给我:
java.lang.UnsatisfiedLinkError:/tmp/.../libindirect.so:/libpure.so: 无法打开共享对象文件: 没有那个文件或目录
我试图通过在其临时文件上显式调用 System.load(...) 来强制 JVM 首先加载“100% C”库,但效果并不好。我怀疑系统在解析 libindirect.so 中的链接时正在寻找它,但并不关心 JVM 加载了什么。
谁能帮我解决这个问题?
谢谢
最佳答案
一种方法是从第一个 Java 进程生成另一个 Java 进程,生成适当的调用脚本。
- 用户调用jar
- 库被提取到一个临时目录
- 一个(bash)脚本被写入临时目录
- 这会设置/导出必要的环境变量
- 这将启动第二个 JRE 实例
- 代码使脚本可执行
- 代码调用脚本
我知道,生成两个 JRE 实例来启动一个应用程序也不是我的第一选择。
关于java - 如何从一个 jar 文件加载依赖于另一个库的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2975858/