Creación de la primera función con Java y MavenCreate your first function with Java and Maven

Este artículo le guiará con el uso de la herramienta de la línea de comandos de Maven para compilar y publicar una función de Java en Azure Functions.This article guides you through using the Maven command-line tool to build and publish a Java function to Azure Functions. Cuando haya terminado, el código de la función se ejecuta en el Plan de consumo en Azure y puede activarse mediante una solicitud HTTP.When you're done, your function code runs on the Consumption Plan in Azure and can be triggered using an HTTP request.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.If you don't have an Azure subscription, create a free account before you begin.

Requisitos previosPrerequisites

Para desarrollar funciones con Java, debe tener instalado lo siguiente:To develop functions using Java, you must have the following installed:

Importante

La variable de entorno JAVA_HOME se debe establecer en la ubicación de instalación del JDK para completar esta guía de inicio rápido.The JAVA_HOME environment variable must be set to the install location of the JDK to complete this quickstart.

Generación de un nuevo proyecto de FunctionsGenerate a new Functions project

En una carpeta vacía, ejecute el comando siguiente para generar el proyecto de Functions desde un arquetipo Maven.In an empty folder, run the following command to generate the Functions project from a Maven archetype.

Linux/macOSLinux/macOS

mvn archetype:generate \
    -DarchetypeGroupId=com.microsoft.azure \
    -DarchetypeArtifactId=azure-functions-archetype 

Nota

Si experimenta problemas al ejecutar el comando, eche un vistazo a qué versión de maven-archetype-plugin se usa.If you're experiencing issues with running the command, take a look at what maven-archetype-plugin version is used. Dado que se ejecuta el comando en un directorio vacío sin ningún archivo .pom, podría estar intentando usar un complemento de la versión anterior de ~/.m2/repository/org/apache/maven/plugins/maven-archetype-plugin si actualizó desde una versión anterior de Maven.Because you are running the command in an empty directory with no .pom file, it might be attempting to use a plugin of the older version from ~/.m2/repository/org/apache/maven/plugins/maven-archetype-plugin if you upgraded your Maven from an older version. Si es así, intente eliminar el directorio maven-archetype-plugin y vuelva a ejecutar el comando.If so, try deleting the maven-archetype-plugin directory and re-running the command.

WindowsWindows

mvn archetype:generate `
    "-DarchetypeGroupId=com.microsoft.azure" `
    "-DarchetypeArtifactId=azure-functions-archetype"
mvn archetype:generate ^
    "-DarchetypeGroupId=com.microsoft.azure" ^
    "-DarchetypeArtifactId=azure-functions-archetype"

Maven le pedirá los valores necesarios para acabar de generar el proyecto.Maven will ask you for values needed to finish generating the project. Para conocer los valores groupId, artifactId y version, consulte la referencia sobre las convenciones de nomenclatura de Maven.For groupId, artifactId, and version values, see the Maven naming conventions reference. El valor appName debe ser único en todo Azure, por lo que Maven genera un nombre de aplicación en función del valor artifactId escrito anteriormente como valor predeterminado.The appName value must be unique across Azure, so Maven generates an app name based on the previously entered artifactId as a default. El valor packageName determina el paquete de Java para el código de función generado.The packageName value determines the Java package for the generated function code.

Los identificadores com.fabrikam.functions y fabrikam-functions siguientes se utilizan como ejemplo y para facilitar la lectura de los pasos posteriores de esta guía de inicio rápido.The com.fabrikam.functions and fabrikam-functions identifiers below are used as an example and to make later steps in this quickstart easier to read. En este paso, se recomienda especificar los valores propios en Maven.You are encouraged to supply your own values to Maven in this step.

Define value for property 'groupId': com.fabrikam.functions
Define value for property 'artifactId' : fabrikam-functions
Define value for property 'version' 1.0-SNAPSHOT : 
Define value for property 'package': com.fabrikam.functions
Define value for property 'appName' fabrikam-functions-20170927220323382:
Confirm properties configuration: Y

Maven crea los archivos del proyecto en una carpeta nueva llamada artifactId, en este ejemplo fabrikam-functions.Maven creates the project files in a new folder with a name of artifactId, in this example fabrikam-functions. El código generado listo para ejecutarse del proyecto es una función desencadenada por HTTP que devuelve el cuerpo de la solicitud:The ready to run generated code in the project is an HTTP triggered function that echoes the body of the request:

public class Function {
    /**
     * This function listens at endpoint "/api/hello". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/hello
     * 2. curl {your host}/api/hello?name=HTTP%20Query
     */
    @FunctionName("hello")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = { HttpMethod.GET, HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        String query = request.getQueryParameters().get("name");
        String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

Habilitación de conjuntos de extensionesEnable extension bundles

La forma más fácil de instalar extensiones de enlace es habilitar conjuntos de extensiones.The easiest way to install binding extensions is to enable extension bundles. Con los conjuntos habilitados, un conjunto predefinido de paquetes de extensiones se instala automáticamente.With bundles enabled, a predefined set of extension packages are automatically installed.

Para habilitar los conjuntos de extensiones, abra el archivo host.json y actualice su contenido para que coincida con el siguiente código:To enable extension bundles, open the host.json file and update its contents to match the following code:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[1.*, 2.0.0)"
    }
}

Ejecución local de la funciónRun the function locally

Cambie de directorio a la carpeta de proyecto que acaba de crear y compile y ejecute la función con Maven:Change directory to the newly created project folder and build and run the function with Maven:

cd fabrikam-function
mvn clean package 
mvn azure-functions:run

Nota

Si experimenta esta excepción: javax.xml.bind.JAXBException con Java 9, consulte la solución alternativa en GitHub.If you're experiencing this exception: javax.xml.bind.JAXBException with Java 9, see the workaround on GitHub.

Esta salida se ve cuando la función se ejecuta localmente en el sistema y está lista para responder a las solicitudes HTTP:You see this output when the function is running locally on your system and ready to respond to HTTP requests:

Listening on http://localhost:7071
Hit CTRL-C to exit...

Http Functions:

   hello: http://localhost:7071/api/hello

Desencadene la función desde la línea de comandos, para lo que debe usar curl en una ventana de terminal nueva:Trigger the function from the command line using curl in a new terminal window:

curl -w "\n" http://localhost:7071/api/hello -d LocalFunction
Hello LocalFunction!

Use Ctrl-C en el terminal para detener el código de función.Use Ctrl-C in the terminal to stop the function code.

Implementación de la función en AzureDeploy the function to Azure

El proceso de implementación en Azure Functions usa las credenciales de cuenta desde la CLI de Azure.The deploy process to Azure Functions uses account credentials from the Azure CLI. Inicie sesión con la CLI de Azure antes de continuar.Sign in with the Azure CLI before continuing.

az login

Implemente el código en una aplicación de función nueva azure-functions:deploy con el destino de Maven.Deploy your code into a new Function app using the azure-functions:deploy Maven target. Esto realiza una implementación comprimida con el modo de ejecutar desde paquete habilitado.This performs a Zip Deploy with Run From Package mode enabled.

Nota

Cuando se usa Visual Studio Code para implementar la aplicación de función, recuerde que debe elegir una suscripción de pago o se producirá un error.When you use Visual Studio Code to deploy your Function app, remember to choose a non-free subscription, or you will get an error. Puede ver la suscripción en el lado izquierdo del IDE.You can watch your subscription on the left side of the IDE.

mvn azure-functions:deploy

Cuando se complete la implementación, verá la dirección URL que puede usar para acceder a la aplicación de función de Azure:When the deploy is complete, you see the URL you can use to access your Azure function app:

[INFO] Successfully deployed Function App with package.
[INFO] Deleting deployment package from Azure Storage...
[INFO] Successfully deleted deployment package fabrikam-function-20170920120101928.20170920143621915.zip
[INFO] Successfully deployed Function App at https://fabrikam-function-20170920120101928.azurewebsites.net
[INFO] ------------------------------------------------------------------------

Pruebe la aplicación de función que se ejecuta en Azure mediante cURL.Test the function app running on Azure using cURL. Es preciso que cambie dirección URL del ejemplo siguiente para coincida con la implementada para su propia aplicación de función en el paso anterior.You'll need to change the URL from the sample below to match the deployed URL for your own function app from the previous step.

Nota

Asegúrese de establecer los derechos de acceso en Anonymous.Make sure you set the Access rights to Anonymous. Al elegir el nivel predeterminado de Function, tiene que presentar la tecla de función en las solicitudes para acceder al punto de conexión de la función.When you choose the default level of Function, you are required to present the function key in requests to access your function endpoint.

curl -w "\n" https://fabrikam-function-20170920120101928.azurewebsites.net/api/hello -d AzureFunctions
Hello AzureFunctions!

Cambios y reimplementaciónMake changes and redeploy

Edite el archivo de código fuente src/main.../Function.java en el proyecto generado para modificar el texto que devuelve la aplicación de función.Edit the src/main.../Function.java source file in the generated project to alter the text returned by your Function app. Cambie esta línea:Change this line:

return request.createResponse(200, "Hello, " + name);

Por lo siguiente:To the following:

return request.createResponse(200, "Hi, " + name);

Guarde los cambios.Save the changes. Ejecute el paquete mvn clean y repita la implementación mediante la ejecución de azure-functions:deploy desde el terminal como antes.Run mvn clean package and redeploy by running azure-functions:deploy from the terminal as before. La aplicación de función se actualizará y esta solicitud:The function app will be updated and this request:

curl -w '\n' -d AzureFunctionsTest https://fabrikam-functions-20170920120101928.azurewebsites.net/api/HttpTrigger-Java

tendrá una salida actualizada:Will have updated output:

Hi, AzureFunctionsTest

Pasos siguientesNext steps

Creó una aplicación de función de Java con un desencadenador HTTP simple y la implementó en Azure Functions.You have created a Java function app with a simple HTTP trigger and deployed it to Azure Functions.