bugfix> java > 投稿

私の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,....

回答 2 件
  • 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アーキテクチャバージョンのバイナリの選択が含まれます。

  • すべてのネイティブライブラリがラムダ環境に存在するわけではないため、DockerまたはEc2を使用してカスタム展開パッケージを作成する必要があります。

    以下がその方法です。 https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-java

あなたの答え