在我的无服务器Java项目中,我必须调用本地库进行图像处理(libvips
)。我正在使用Gradle创建一个zip文件并将所有依赖项(包括本机库)发送到lib文件夹:
task buildZip(type: Zip) {
archiveName = "${project.name}.zip"
from compileJava
from processResources
from('.') {
include 'lib/**'
include 'bin/**'
}
into('lib') {
from configurations.runtime
}
}
在生成的zip文件中,在
lib
文件夹中,所有库都存在(jars / native / etc)。通过
serverless deploy
部署功能后,我无法使用libvips.so
加载Native.loadLibrary("/var/task/lib/libvips.so", Object.class)
库。显然,在/var/task/lib/
中只定位了Java依赖项,而不是本机库。AWS存储本地库是否还有另一条路径?
编辑
抛出异常:
ava.lang.UnsatisfiedLinkError: Unable to load library '/var/task/lib/libvips.so': Native library (var/task/lib/libvips.so) not found in resource path ([file:/var/task/, file:/var/task/lib/aopalliance-repackaged-2.5.0-b42.jar, file:/var/task/lib/asm-all-repackaged-2.5.0-b42.jar, file:/var/task/lib/aws-java-sdk-core-1.11.336.jar, file:/var/task/lib/aws-java-sdk-kms-1.11.336.jar, file:/var/task/lib/aws-java-sdk-s3-1.11.336.jar, file:/var/task/lib/aws-lambda-java-core-1.1.0.jar,....
最佳答案
您需要指定 java.library.path
JVM属性。
通过修改JVM命令行选项
JAVA_OPTS = $JAVA_OPS -Djava.library.path= /var/task/lib/
java $JAVA_OPTS ...
或直接在您的代码中对其进行修改
System.setProperty("java.library.path", "/var/task/lib/");
System.loadLibrary("libvips.so");
另外,您可以使用JNA库。 JNA提供了从添加到JVM类路径的JAR存档(资源)中自动解压缩和加载本地库管理员的功能。它包括选择正确的操作系统和CPU体系结构版本二进制文件。