通过 Java 和 Maven 创建你的第一个函数(预览版)

Note

用于 Azure Functions 的 Java 当前为预览版。

本快速入门可指导通过 Maven 创建无服务器函数项目,在本地对其进行测试,并将其部署到 Azure。 完成后,你的 Java 函数代码将在云中运行,并可以通过 HTTP 请求触发。

通过 cURL 从命令行中访问 Hello World 函数

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

若要通过 Java 开发函数应用,必须安装以下软件:

Important

JAVA_HOME 环境变量必须设置为 JDK 的安装位置,以完成本快速入门。

安装 Azure Functions Core Tools

Azure Functions 核心工具 2.0 为编写、运行和调试 Azure Functions 提供了本地开发环境。

若要进行安装,请访问 Azure Functions Core Tools 项目的安装部分,找到操作系统的具体说明。

也可以在安装以下必备组件后,使用 Node.js 随附的 npm 手动安装此工具:

若要继续进行基于 npm 的安装,请运行:

npm install -g azure-functions-core-tools@core

Note

如果在安装 Azure Functions 核心工具版本 2.0 时遇到问题,请参阅版本 2.x 运行时

生成新的 Functions 项目

在空的文件夹中,运行以下命令以从 Maven archetype 生成 Functions 项目。

Linux/MacOS

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

Windows (CMD)

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

Maven 会请求你提供所需的值以完成项目的生成。 有关 groupId、artifactId 和 version 值,请参阅 Maven 命名约定参考。 AppName 值在 Azure 中必须唯一,以便 Maven 基于以前输入的 artifactId 生成默认应用名称。 PackageName 值确定所生成函数代码的 Java 包。

下面的 com.fabrikam.functionsfabrikam-functions 标识符用作示例,目的是使本快速入门中后面的步骤更易读。 建议你在此步骤中向 Maven 提供你自己的值。

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

在此示例 fabrikam-functions 中,Maven 在新文件夹中创建名为 artifactId 的项目文件 项目中生成的可以运行的代码是一个简单的回显请求正文的 HTTP 触发函数:

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<String> hello(
            @HttpTrigger(name = "req", methods = {"get", "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.createResponse(400, "Please pass a name on the query string or in the request body");
        } else {
            return request.createResponse(200, "Hello, " + name);
        }
    }
}

在本地运行函数

将目录更改为新创建的项目文件夹,并通过 Maven 生成和运行此函数:

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

Note

如果在使用 Java 9 时遇到 javax.xml.bind.JAXBException 异常,请参阅 GitHub 上的解决方法。

当函数在本地系统上运行并且做好响应 HTTP 请求的准备时,将显示以下输出:

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

Http Functions:

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

使用 curl 在新的终端窗口中从命令行触发函数:

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

在终端中使用 Ctrl-C 停止函数代码。

将函数部署到 Azure

部署到 Azure Functions 的过程中会使用 Azure CLI 中的帐户凭据。 在继续操作之前使用 Azure CLI 登录

az login

使用 azure-functions:deploy Maven 目标将代码部署到新的函数应用。

mvn azure-functions:deploy

部署完成后,将显示可用于访问你的 Azure 函数应用的 URL:

[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.chinacloudsites.cn
[INFO] ------------------------------------------------------------------------

使用 cURL 测试在 Azure 上运行的函数应用。 需更改以下示例中的 URL,使之与前一步骤中你自己的函数应用的已部署 URL 匹配。

curl -w '\n' https://fabrikam-function-20170920120101928.chinacloudsites.cn/api/hello -d AzureFunctions
Hello AzureFunctions!

进行更改并重新部署

编辑生成的项目中的 src/main.../Function.java 源文件来更改你的函数应用返回的文本。 更改以下行:

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

更改为以下内容:

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

保存更改,如以前一样通过从终端运行 azure-functions:deploy 进行重新部署。 函数应用将更新,并且以下请求:

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

将具有更新的输出:

Hi, AzureFunctionsTest

后续步骤

你已使用简单的 HTTP 触发器创建 Java 函数应用,并将其部署到 Azure Functions。