Javaコード専用ファンクションの作成
OCI FunctionsでJavaコード専用関数をパッケージ化および作成する方法をご覧ください。
コンテナ・イメージを作成せずにJavaファンクション・コードをデプロイする場合は、Javaコード専用ファンクションを使用します。
このフローは、サポートされているJavaランタイムでファンクションを実行できる場合に使用します。
Javaコード専用ファンクションを作成する前に、Javaファンクションをuber/fat JARファイルとして、またはルート・レベルのuber/fat JARファイルが1つのみ含まれるZIPアーカイブとしてパッケージ化します。一般的なコード専用ファンクションの前提条件は、コード専用ファンクションの作成を参照してください。サポートされているJavaランタイム・バージョンおよびランタイム名は、コード専用関数でサポートされている言語を参照してください。
さらに、Javaコード専用ファンクションをパッケージ化および作成するには、次のものが必要です。
- Java開発環境。
- Maven、Gradleまたは別のJavaビルド・ツール。
- uber/fat JARファイルとしてパッケージ化されたJava関数、または1つのルート・レベルのuber/fat JARファイルのみを含むZIPアーカイブとしてパッケージ化されたJava関数。
- 有効なJavaハンドラ値。
Javaアーカイブの要件
Javaコード専用関数の場合:
- 単純なJava関数にはJARファイルを使用します。
- ファンクションにリソースまたはネイティブ依存関係が含まれている場合は、ZIPファイルを使用します。
- Java JARは、ファンクション・コードと必要なJava依存性を含むuber/fat JARである必要があります。
- Maven ShadeプラグインやGradle shadow JARプラグインなどの適切なMavenまたはGradleプラグインを使用して、uber/fat JARを作成します。
- ZIPファイルを指定する場合は、アーカイブ・ルートにルート・レベルのuber/fat JARファイルが1つのみ含まれている必要があります。
.jar拡張では、大/小文字は区別されません。resources/はオプションです。native/はオプションですが、存在する場合はアーキテクチャ固有のルールに従う必要があります。- ハンドラは必須です。
- ハンドラは、どのJavaメソッドを起動するかをOCI関数に指示します。
Javaハンドラ
選択したJavaランタイムで想定されるハンドラ形式を使用します。
例:
com.example.HelloFunction::handleRequest
シンプルなJavaアーカイブ
ファンクションにリソースまたはネイティブ依存性が必要ない場合、JARファイルを使用します。
アップロード前のレイアウトの例:
main.jar
JARファイルには、コンパイルされた関数クラスと必要なJava依存性が含まれています。
ルール:
- JARファイルには任意の名前を付けることができます。
- JARファイルはuber/fat JARである必要があります。
- JARファイルには、ファンクション・コードと必要なJava依存性が含まれている必要があります。
uber/fat JARの構築
uber/fat JARは、コンパイルされた関数クラスと、その関数に必要なJavaライブラリを含むJARファイルです。JARへの依存性をパッケージ化すると、ファンクションは自己完結型になります。
Maven用のMaven ShadeプラグインやGradle用のShadowプラグインなど、ビルド・ツール・プラグインを含むuber/fat JARを作成できます。
Mavenプロジェクトの場合、Maven Shadeプラグインを構成してuber/fat JARをビルドし、次を実行します:
mvn clean package
Gradleプロジェクトの場合、uber/fat JARを構築するためにShadowプラグインまたは同等のプラグインを構成し、次を実行します:
./gradlew clean build
ビルドが完了したら、uber/fat JARをクリーンなパッケージング・ディレクトリにコピーします。関数が単純なJava関数である場合、JARファイルを関数アーカイブとして使用できます。この関数にリソースまたはネイティブ依存関係が含まれている場合は、アーカイブ・ルートにJARファイルが含まれ、必要な場所に追加ファイルが含まれるZIPアーカイブを作成します。
Java ZIPアーカイブ
ファンクションに追加のリソースまたはネイティブ依存関係が含まれている場合は、ZIPアーカイブを使用します。
次の構造を使用します。
archive-root/
├── main.jar
└── resources/ # optional
ルール:
main.jarは、アーカイブ・ルートにある単一のuber/fat JARを表します。JARには任意の名前を指定できます。resources/はオプションであり、使用する場合はアーカイブ・ルートにある必要があります。
JARおよびリソースを含むZIPファイルを作成するには、次を実行します:
zip -r function.zip main.jar resources/
Javaランタイム・オプションの構成
Javaコード専用ファンクションの場合は、ランタイム・オプション・ファイルまたは引数ファイルをファンクション・アーカイブにパッケージ化しないでください。JAVA_TOOL_OPTIONSなどの関数構成変数を設定して、JVM起動オプションを構成します。
たとえば、次のコマンドでは、キーJAVA_TOOL_OPTIONSおよび値-Dapp.environment=productionを使用してファンクション構成パラメータを設定します。
fn config function <app-name> <function-name> JAVA_TOOL_OPTIONS "-Dapp.environment=production"
実行時に、JavaランタイムはJAVA_TOOL_OPTIONS値を読み取り、JVMオプションを適用します。この例では、Javaシステム・プロパティapp.environmentをproductionに設定します。
ファンクションの構成の詳細は、ファンクションに渡すカスタム構成パラメータの指定を参照してください。
ネイティブ依存性を持つJavaアーカイブ
通常、Java関数はアーキテクチャに依存しません。ただし、Java関数が、JNIまたは別のネイティブ・メカニズムを介してロードされた.soファイルなどのネイティブ・ライブラリを使用する場合は、ネイティブ・ライブラリをデプロイメント・アーカイブにバンドルして、OCI Functionsアプリケーションのアーキテクチャと一致していることを確認します。
x86アプリケーションの場合:
archive-root/
├── main.jar
├── resources/ # optional
└── native/
└── fn-arch-x86/
ARMアプリケーションの場合:
archive-root/
├── main.jar
├── resources/ # optional
└── native/
└── fn-arch-arm/
マルチアーキテクチャ・アプリケーションの場合:
archive-root/
├── main.jar
├── resources/ # optional
└── native/
├── fn-arch-x86/
└── fn-arch-arm/
ルール:
native/はオプションです。native/が存在する場合は、native/の下にファイルを直接配置しないでください。- x86アプリケーションの場合、
native/にはfn-arch-x86/のみを含める必要があります。 - ARMアプリケーションの場合、
native/にはfn-arch-arm/のみを含める必要があります。 - マルチアーキテクチャ・アプリケーションの場合は、
native/にfn-arch-x86/とfn-arch-arm/の両方が含まれている必要があります。 - ネイティブ・バイナリは、Linuxおよび正しいアーキテクチャ用にコンパイルする必要があります。
Javaランタイムの動作
Javaコード専用関数の場合、OCI関数は、指定したハンドラ値を使用して、関数アーカイブのJavaメソッドを呼び出します。
ファンクション・コードおよび必要なJava依存関係をuber/fat JARファイルにパッケージ化する責任があります。
Javaコード専用ファンクションの作成
Javaコード専用ファンクションを作成するには、「コード専用ファンクションの作成」の手順に従います。たとえば、コンソールを使用してJavaコード専用ファンクションを作成するには:
- 「アプリケーション」リスト・ページで、Javaコード専用ファンクションを作成するアプリケーションを選択します。リストページまたはアプリケーションの検索に関するヘルプが必要な場合は、Listing Applicationsを参照してください。
-
「Functions」タブを選択します。
「関数」リスト・ページが開きます。選択したアプリケーションのすべての関数が表に表示されます。
- 「アーカイブから作成」を選択し、ファイル・ソース、Javaアーカイブ、サポートされているJavaランタイム、Javaハンドラなど、Javaコード専用関数の詳細を指定します。
Javaコード専用ファンクションの場合、ファンクションの作成時にハンドラを指定する必要があります。
- 必要に応じて、ファンクションの他の詳細を指定します(コードのみのファンクションの作成を参照)。
- 「作成」を選択してファンクションを作成します。
Javaコード専用ファンクションが作成され、他のファンクションと同様に起動できます。
トラブルシューティング
| エラー・コード | 問題 | おそらく原因 | 推奨される修正 |
|---|---|---|---|
400 |
ルートJARが存在しないため、アーカイブ検証に失敗する | JARは、アーカイブ・ルートではなくtarget/などのフォルダの下にネストされます。 |
1つのJARをアーカイブ・ルートに配置します。 |
400 |
複数のルートJARが存在するため、アーカイブ検証に失敗する | アーカイブ・ルートに複数の.jarファイルが存在します |
単一のfatまたはuber JARをパッケージ化します。 |
400 |
依存関係がないため、関数は失敗します | JARには必要な依存関係は含まれません | 依存関係を含むfatまたはuber JARを作成します。 |
400 |
ハンドラ・エラー | ハンドラが欠落しているか、スペルが誤っているか、間違ったクラスまたはメソッドを指しています | ハンドラ値とクラス/メソッドのシグネチャを確認します。 |
400 |
ネイティブ依存関係エラー | ネイティブ・ライブラリは間違ったアーキテクチャまたはOS用に構築されました | Linux用のネイティブライブラリと正しいアーキテクチャーを再構築します。 |
400 |
ネイティブ・アーカイブの検証に失敗しました | ファイルはnative/の直下に配置されました。 |
native/fn-arch-x86/またはnative/fn-arch-arm/の下にファイルを移動します。 |
400 |
マルチアーキテクチャのネイティブ・アーカイブが検証に失敗する | 1つのネイティブ・アーキテクチャ・ディレクトリがありません | native/fn-arch-x86/とnative/fn-arch-arm/の両方を含めます。 |