java - 如何在 AWS Lambda 中加载本地库?

标签 java amazon-web-services aws-lambda serverless-framework

在我的 java 无服务器项目中,我必须调用本地库进行图像处理 (libvips)。我正在使用 Gradle 创建一个 zip 文件并将所有依赖项发送到 lib 文件夹,包括 native 库:

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).显然在 /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 存档(资源)中自动解压和加载 native 库管理员的功能。它包括选择正确的操作系统和 CPU 架构版本二进制文件。

关于java - 如何在 AWS Lambda 中加载本地库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529092/

相关文章:

java - 如何发送多个选项卡的公共(public)请求?

java - Eclipse "Terminate/Disconnect All"行为

amazon-web-services - 无服务器 AWS - 是否值得使用自定义授权方(作为 lambda)?

amazon-web-services - MassTransit.RabbitMqTransport.RabbitMqAddressException : 'The invalid scheme was specified: amqps'

aws-lambda - DevOps : AWS Lambda . zip 与 Terraform

Java 程序将表转储为一组插入语句

java - Android与PC Socket连接

json - 在Cloudformation中传递标签的json文件

aws-lambda - 无法删除由 Cloud Formation 创建的 Lambda@Edge

reactjs - 如何使用 aws-amplify 处理 api 错误?