Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在AWS Lambda中加载本机库?_Java_Amazon Web Services_Aws Lambda_Serverless Framework - Fatal编程技术网

Java 如何在AWS Lambda中加载本机库?

Java 如何在AWS Lambda中加载本机库?,java,amazon-web-services,aws-lambda,serverless-framework,Java,Amazon Web Services,Aws Lambda,Serverless Framework,在我的java无服务器项目中,我必须调用本机库进行图像处理(libvips)。我正在使用Gradle创建一个zip文件,并将所有依赖项(包括本机库)发送到lib文件夹: task buildZip(type: Zip) { archiveName = "${project.name}.zip" from compileJava from processResources from('.') { include 'lib/**' include 'bin/**' } into('l

在我的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创建自定义部署包

以下是您将如何做到这一点:

您需要指定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提供了从添加到JVM类路径的JAR归档(资源)中自动解压缩和加载本机库员的功能。它包括选择正确的操作系统和CPU体系结构版本二进制文件。

谢谢,我已经在serverless.yml中设置了库路径,问题是本地库没有存储在那里。这里只有JAR,我正在使用JNA调用本机库检查:同时检查UNIX用户(启动应用程序服务器的用户)是否能够从
/var/task/lib/
写入和执行代码,以及检查libvips.so是否具有execute file属性。如果它有,则从该路径读取,只是本地库不存在。这就是为什么我想知道这些库是否存储在其他路径中。。