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コード専用ファンクションを作成するには:

  1. 「アプリケーション」リスト・ページで、Javaコード専用ファンクションを作成するアプリケーションを選択します。リストページまたはアプリケーションの検索に関するヘルプが必要な場合は、Listing Applicationsを参照してください。
  2. 「Functions」タブを選択します。

    「関数」リスト・ページが開きます。選択したアプリケーションのすべての関数が表に表示されます。

  3. 「アーカイブから作成」を選択し、ファイル・ソース、Javaアーカイブ、サポートされているJavaランタイム、Javaハンドラなど、Javaコード専用関数の詳細を指定します。

    Javaコード専用ファンクションの場合、ファンクションの作成時にハンドラを指定する必要があります。

  4. 必要に応じて、ファンクションの他の詳細を指定します(コードのみのファンクションの作成を参照)。
  5. 「作成」を選択してファンクションを作成します。

    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/の両方を含めます。