Java 使用Spring引导加载本机库
我有一个加载本机库的简单Spring引导项目。问题是,我不知道在运行应用程序时如何指定本机库的路径 我已经阅读了大量解释如何设置Java 使用Spring引导加载本机库,java,spring-boot,gradle,Java,Spring Boot,Gradle,我有一个加载本机库的简单Spring引导项目。问题是,我不知道在运行应用程序时如何指定本机库的路径 我已经阅读了大量解释如何设置java.library.path的帖子,但每一篇都会导致 java.lang.UnsatisfiedLinkError: /path/to/lib/libconnector.so: libconnector.so: cannot open shared object file: No such file or directory 如果我从命令行按顺序运行这两个命令,
java.library.path
的帖子,但每一篇都会导致
java.lang.UnsatisfiedLinkError: /path/to/lib/libconnector.so: libconnector.so: cannot open shared object file: No such file or directory
如果我从命令行按顺序运行这两个命令,项目将正常工作:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib
./gradlew bootRun
该库已加载并运行。但我无法在gradle文件中指定库路径。我试过了
run {
systemProperty 'java.library.path', file('/path/to/lib')
}
bootRun {
systemProperty 'java.library.path', file('/path/to/lib')
}
还有各种各样的变化。还尝试将VM参数添加到我的IDE等,但没有任何效果。有人能解释一下我做错了什么吗
这就是我加载本机库的方式(位于$projectRoot/lib
):
您可以简单地使用:
dependencies {
compile files('libs/something_local.jar')
}
我终于解决了我的问题。运行应用程序时,我应该将
LD\u LIBRARY\u PATH
作为环境变量传递,而不是将java.LIBRARY.PATH
作为系统属性传递
以下Gradle修改解决了我的问题:
tasks.withType(JavaExec) {
environment('LD_LIBRARY_PATH', 'lib')
}
您可以编写一个
init
方法来自动设置java.library.path
,
以下是一些代码:
String path = "/path/to/lib";
String path = System.getProperty("java.library.path");
// if os is windows
path += ";" + classPath.getCanonicalPath();
// if os is linux
path += ":" + classPath.getCanonicalPath();
System.setProperty("java.library.path", path);
注意:首先运行此方法。尝试从类中加载库(只是为了测试) 注:我不确定,但如果你需要使用so文件,你必须在linux操作系统上
public class Test {
static {
try {
System.loadLibrary("yourSohere");
// or System.load("/path/to/lib.so");
}
}
}
这是一个本机
。因此
库,而不是java依赖项,因此这种方法不起作用。我需要能够用JNI加载它。它需要位于java.library.path
public class Test {
static {
try {
System.loadLibrary("yourSohere");
// or System.load("/path/to/lib.so");
}
}
}