2016-05-24 10 views
1

私はJVM上で動作するアプリを持っていますが、これはファットジャーとして提供されています。ネイティブのLinuxバイナリを呼び出す必要があります(例:ffmpeg)。 jarファイルと実行ファイルの両方をパッケージ化するためには、Zipファイルにどのディレクトリ構造を含める必要がありますか?私はドキュメンテーションを見つけることができません。私が作業していないビルドツールを使用したコード例だけです。AWS LambdaパッケージNative Executable with JAR

私のラムダの名前はblahのふりをしましょう。

Deployable jar contains: 
    + blah/ # contains fat jar 
    + lib/ # contains ffmpeg 

私が書いたbashスクリプトはうまくいきません。次のような回答を得たいと考えています。ファットjarとネイティブの実行可能ファイルを一緒に圧縮する前に、dist/ディレクトリに置きます。

FATJAR=blah-assembly-0.0.4.jar 
mkdir -p dist/ 
rm -f dist/* 
rm -f $DEPLOYED_ZIP 
cp $FATJAR dist/ 
cp /usr/local/bin/ffmpeg dist/ 
(cd dist && zip -r $FATJAR ffmpeg && mv $FATJAR ../$DEPLOYED_ZIP) 
+0

http://stackoverflow.com/questions/2937406/how-to-bundle-a-native-library-and-a-jni-library-inside-a-jar - 実行中は実行できませんjarファイルを手動でローカルファイルシステムにコピーして、あなたが好きな場所に置いたり、あなたのためにこれを行うユーティリティを使用しなければなりません。あなたがaws lamdaでローカルファイルシステムを使用することが許されていれば、ネイティブライブラリを完全に使用できなくなる可能性があります。 – zapl

+0

$ DEPLOYED_ZIPはファイルをLambdaに配信するためのジップです。私はそれが他のすべてのアップロードのようにLambdaによって自動的に解凍されることを期待しています。とにかく、あなたは私の質問に答えませんでした:AWS LambdaにJVMアプリケーションを展開するためのzipファイルの必要なディレクトリの内容は、別の実行可能ファイルも配信される必要がありますか? –

+0

@MikeSlinnあなたはこれまで働いたことがありましたか?もしあなたがあなた自身の質問に答えることができれば、私はまさにこれをするのに苦労しています。私がjarファイルとバイナリファイルを圧縮してLambdaに送信すると、lambdaはjarファイルのエントリポイントを見つけられません。 –

答えて

0

パッケージに含まれるネイティブバイナリがPATHに表示されるか、フルパスで呼び出される限り、zipファイルの構造はすべて行います。どちらの場合もこれを使用すると、次のいずれかの方法でJavaコードを更新する必要があることを意味します

  1. PATH環境変数または
  2. はフルパスでバイナリを呼び出して変更します。

AWS Lambdaシステムでパッケージの内容が抽出されるディレクトリのパスは、LAMBDA_TASK_ROOT環境変数から読み取ることができます。

+0

1)これは実行可能なjarをネイティブの実行可能ファイルと一緒にzipにパッケージ化する必要があるのか​​、それともアンパックされるためにjarファイルをネイティブ実行可能ファイルで拡張するべきかを意味しますか? 2)Scalaの場合、パスは次のように表現できます: 'Option(sys.env(" LAMBDA_TASK_ROOT ")。getOrElse(" ./ ")' –

+0

1)zipのjarファイルと一緒にネイティブ実行ファイルをパッキングする確かに。他のオプションについてはコメントできません。 2)私はScalaに慣れていませんが、PATH環境変数を設定するための完全なコードであると仮定して、コードは私には見えません。 – Leon

+0

2)他のコードは、 "定義されている場合はenv varを使用する"を意味し、そうでない場合は現在のディレクトリを調べることを意味します。 –