Creación de funciones de solo código Java

Descubra cómo empaquetar y crear funciones solo de código Java en OCI Functions.

Utilice una función de sólo código Java cuando desee desplegar el código de función Java sin crear una imagen de contenedor.

Utilice este flujo cuando la función se pueda ejecutar en un tiempo de ejecución de Java Runtime soportado.

Antes de crear una función de sólo código Java, empaquete la función Java como un archivo JAR uber/fat o como un archivo ZIP que contenga exactamente un archivo JAR uber/fat de nivel raíz. Para conocer los requisitos generales de las funciones de solo código, consulte Creación de funciones de solo código. Para conocer las versiones de tiempo de ejecución de Java y los nombres de tiempo de ejecución soportados, consulte Idiomas soportados para funciones de solo código.

Además, para empaquetar y crear funciones de solo código Java, necesita:

  • Entorno de desarrollo Java.
  • Maven, Gradle u otra herramienta de creación de Java.
  • Una función Java empaquetada como un archivo JAR uber/fat, o como un archivo ZIP que contiene exactamente un archivo JAR uber/fat de nivel raíz.
  • Un valor de manejador Java válido.

Requisitos de archivo Java

Para las funciones de solo código Java:

  • Utilizar un archivo JAR para una función Java simple.
  • Utilice un archivo ZIP cuando la función incluya recursos o dependencias nativas.
  • Java JAR debe ser un JAR uber/fat que incluya el código de función y las dependencias Java necesarias.
  • Cree el JAR uber/fat mediante un plugin Maven o Gradle adecuado, como el plugin Maven Shade o un plugin Gradle shadow JAR.
  • Si proporciona un archivo ZIP, el archivo ZIP debe contener exactamente un archivo JAR uber/fat de nivel raíz en la raíz del archivo.
  • La extensión .jar no distingue entre mayúsculas y minúsculas.
  • resources/ es opcional.
  • native/ es opcional, pero si está presente debe seguir reglas específicas de la arquitectura.
  • Se necesita un manejador.
  • El manejador indica a OCI Functions a qué método Java llamar.

Manejador Java

Utilice el formato de manejador esperado por el tiempo de ejecución de Java Runtime seleccionado.

Ejemplo:

com.example.HelloFunction::handleRequest

Archivo Java simple

Utilice un archivo JAR cuando la función no necesite recursos ni dependencias nativas.

Ejemplo de diseño antes de cargar:

main.jar

El archivo JAR contiene las clases de funciones compiladas y las dependencias Java necesarias.

Reglas:

  • El archivo JAR puede tener cualquier nombre.
  • El archivo JAR debe ser un JAR uber/fat.
  • El archivo JAR debe incluir el código de función y las dependencias Java necesarias.

Crear un JAR de uber/fat

Un archivo JAR uber/fat es un archivo JAR que contiene las clases de funciones compiladas y las bibliotecas Java necesarias para la función. Las dependencias de empaquetado en el JAR hacen que la función sea autónoma.

Puede crear un JAR uber/fat con plugins de herramienta de compilación, como el plugin Maven Shade para Maven o un plugin Shadow para Gradle.

Para proyectos de Maven, configure el plugin de sombra de Maven para crear un JAR uber/fat y, a continuación, ejecute:

mvn clean package

Para los proyectos de Gradle, configure un plugin Shadow o un plugin equivalente para crear un JAR uber/fat y, a continuación, ejecute:

./gradlew clean build

Una vez finalizada la compilación, copie el archivo JAR uber/fat en un directorio de empaquetado limpio. Si la función es una función Java simple, puede utilizar el archivo JAR como archivo de función. Si la función incluye recursos o dependencias nativas, cree un archivo ZIP que contenga el archivo JAR en la raíz del archivo e incluya los archivos adicionales en las ubicaciones necesarias.

Archivo ZIP de Java

Utilice un archivo ZIP cuando la función incluya recursos adicionales o dependencias nativas.

Esta estructura se utiliza:

archive-root/
          ├── main.jar
          └── resources/ # optional

Reglas:

  • main.jar representa el único JAR uber/fat en la raíz del archivo. El JAR puede tener cualquier nombre.
  • resources/ es opcional y debe estar en la raíz del archivo si se utiliza.

Para crear un archivo ZIP que incluya el JAR y los recursos, ejecute:

zip -r function.zip main.jar resources/

Configurar opciones de Java Runtime

Para las funciones de sólo código Java, no empaquete archivos de opciones de tiempo de ejecución ni archivos de argumentos en el archivo de funciones. Configure las opciones de inicio de JVM definiendo variables de configuración de función, como JAVA_TOOL_OPTIONS.

Por ejemplo, el siguiente comando define un parámetro de configuración de función con la clave JAVA_TOOL_OPTIONS y el valor -Dapp.environment=production:

fn config function <app-name> <function-name> JAVA_TOOL_OPTIONS "-Dapp.environment=production"

En tiempo de ejecución, el tiempo de ejecución de Java lee el valor JAVA_TOOL_OPTIONS y aplica la opción JVM. En este ejemplo, la opción define la propiedad del sistema Java app.environment en production.

Para obtener más información sobre la configuración de funciones, consulte Specifying Custom Configuration Parameters to Pass to Functions.

Archivo Java con dependencias nativas

Las funciones Java suelen ser independientes de la arquitectura. Sin embargo, si la función Java utiliza bibliotecas nativas, como archivos .so cargados a través de JNI u otro mecanismo nativo, agrupe las bibliotecas nativas en el archivo de despliegue y asegúrese de que coinciden con la arquitectura de la aplicación OCI Functions.

Para una aplicación x86:

archive-root/
├── main.jar
├── resources/  # optional
└── native/
    └── fn-arch-x86/

Para una aplicación de ARM:

archive-root/
├── main.jar
├── resources/  # optional
└── native/
    └── fn-arch-arm/

Para una aplicación de arquitectura múltiple:

archive-root/
├── main.jar
├── resources/  # optional
└── native/
    ├── fn-arch-x86/
    └── fn-arch-arm/

Reglas:

  • native/ es opcional.
  • Si existe native/, no coloque los archivos directamente en native/.
  • Para las aplicaciones x86, native/ solo debe contener fn-arch-x86/.
  • Para las aplicaciones de ARM, native/ solo debe contener fn-arch-arm/.
  • Para aplicaciones de arquitectura múltiple, native/ debe contener fn-arch-x86/ y fn-arch-arm/.
  • Los binarios nativos se deben compilar para Linux y la arquitectura correcta.

Comportamiento de Java Runtime

Para las funciones de solo código Java, OCI Functions utiliza el valor de manejador que especifique para llamar al método Java en el archivo de funciones.

Vd. es responsable de empaquetar el código de función y las dependencias Java necesarias en un archivo JAR uber/fat.

Creación de una función de solo código Java

Para crear una función de solo código Java, siga las instrucciones de Creación de funciones de solo código. Por ejemplo, para crear una función de solo código Java mediante la consola:

  1. En la página de lista Aplicaciones, seleccione la aplicación en la que desea crear la función de solo código Java. Si necesita ayuda para buscar la página de lista o la aplicación, consulte Listado de aplicaciones.
  2. Seleccione el separador Funciones.

    Se abre la página de lista Funciones. Todas las funciones de la aplicación seleccionada se muestran en una tabla.

  3. Seleccione Crear desde Archivo y especifique detalles para la función de solo código Java, incluido el origen de archivo, el archivo Java, un tiempo de ejecución Java soportado y un manejador Java.

    Para las funciones de sólo código Java, debe especificar un manejador al crear la función.

  4. Especifique otros detalles para la función según sea necesario (consulte Creación de Funciones de Sólo Código).
  5. Seleccione Crear para crear la función.

    La función de sólo código Java se crea y se puede llamar como cualquier otra función.

Solución de problemas

Código de error Problema Causa probable Corrección recomendada
400 La validación del archivo falla porque no existe ningún JAR raíz El JAR está anidado en una carpeta como target/ en lugar de en la raíz del archivo Coloque exactamente un archivo JAR en la raíz del archivo.
400 La validación del archivo falla porque existen varios JAR raíz Hay más de un archivo .jar en la raíz del archivo Envase una sola grasa o uber JAR.
400 La función falla porque faltan dependencias El JAR no incluye las dependencias necesarias Crear un JAR de grasa o uber que incluya dependencias.
400 Error de manejador Falta el manejador, está mal escrito o apunta a una clase o método incorrectos Confirme el valor del manejador y la firma de clase/método.
400 Error de dependencia nativa La biblioteca nativa se ha creado para la arquitectura o el sistema operativo incorrectos Vuelva a crear la biblioteca nativa para Linux y la arquitectura correcta.
400 Fallo de validación de archivo nativo Los archivos se colocaron directamente en native/ Mueva los archivos en native/fn-arch-x86/ o native/fn-arch-arm/.
400 Fallo de validación del archivo nativo de varias arquitecturas Falta un directorio de arquitectura nativo Incluya native/fn-arch-x86/ y native/fn-arch-arm/.