如何在 AWS Lambda 中加载本地库?
How to load native libraries in AWS Lambda?
在我的 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
部署函数后,我无法使用 Native.loadLibrary("/var/task/lib/libvips.so", Object.class)
加载 libvips.so
库。显然在 /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,....
并非所有本机库都存在于 lambda 环境中,您必须使用 docker 或 Ec2 制作自定义部署包。
以下是您将如何做到这一点:
https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-java
您需要指定 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 class 路径的 JAR 存档(资源)中自动解压和加载本机库管理员的功能。它包括选择正确的操作系统和 CPU 体系结构版本二进制文件。
在我的 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
部署函数后,我无法使用 Native.loadLibrary("/var/task/lib/libvips.so", Object.class)
加载 libvips.so
库。显然在 /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,....
并非所有本机库都存在于 lambda 环境中,您必须使用 docker 或 Ec2 制作自定义部署包。
以下是您将如何做到这一点: https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-java
您需要指定 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 class 路径的 JAR 存档(资源)中自动解压和加载本机库管理员的功能。它包括选择正确的操作系统和 CPU 体系结构版本二进制文件。