gpt4 book ai didi

通过 terraform azurerm_function_app_function 的 Azure 函数抛出 ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-03 03:39:32 29 4
gpt4 key购买 nike

我们使用 Terraform resource 创建了一个 Azure 函数azurerm_function_app_function

地形代码

  • Terraform v1.1.0
  • 提供商 azurerm 3.0.2
resource "azurerm_function_app_function" "default" {
name = "MyAzureFunction"
function_app_id = azurerm_linux_function_app.default.id
language = "Java"

file {
name = "my-java-app-1.0-SNAPSHOT.jar"
content = filebase64("my-java-app-1.0-SNAPSHOT.jar")
}

config_json = jsonencode({
"scriptFile" : "my-java-app-1.0-SNAPSHOT.jar",
"entryPoint" : "com.mypackage.MyClass.runEvent",
"bindings" : [
{
"type" : "eventGridTrigger",
"direction" : "in",
"name" : "eventGridEvent"
}
]
})
}

Java代码

package com.mypackage;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.EventGridTrigger;
import com.microsoft.azure.functions.annotation.FunctionName;

public class MyClass {

@FunctionName("MyAzureFunction")
public void runEvent(@EventGridTrigger(name = "eventGridEvent") String event, final ExecutionContext context) {
context.getLogger().info("Java Event Grid trigger function executed.");
context.getLogger().info(event);
}
}

但不幸的是我们面临着 ClassNotFoundException 异常:

Result: Failure Exception: ClassNotFoundException: com.mypackage.MyClass Stack: java.lang.ClassNotFoundException: com.mypackage.MyClass
java.base/java.net.URLClassLoader.findClass(Unknown Source)
java.base/java.lang.ClassLoader.loadClass(Unknown Source)
java.base/java.lang.ClassLoader.loadClass(Unknown Source)
java.base/java.lang.Class.forName0(Native Method)
java.base/java.lang.Class.forName(Unknown Source)
com.microsoft.azure.functions.worker.broker.EnhancedJavaMethodExecutorImpl.getContainingClass(EnhancedJavaMethodExecutorImpl.java:63)
com.microsoft.azure.functions.worker.broker.EnhancedJavaMethodExecutorImpl.<init>(EnhancedJavaMethodExecutorImpl.java:22)
com.microsoft.azure.functions.worker.broker.FactoryJavaMethodExecutor.getJavaMethodExecutor(FactoryJavaMethodExecutor.java:20)
com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.loadMethod(JavaFunctionBroker.java:35)
com.microsoft.azure.functions.worker.handler.FunctionLoadRequestHandler.execute(FunctionLoadRequestHandler.java:27)
com.microsoft.azure.functions.worker.handler.FunctionLoadRequestHandler.execute(FunctionLoadRequestHandler.java:9)
com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92)
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
java.base/java.util.concurrent.FutureTask.run(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.base/java.lang.Thread.run(Unknown Source)

最佳答案

尽管使用了 Maven 插件或 func CLI,但几乎没有关于如何部署 java 函数的文档。在官方 azure 文档中,他们提到可以上传包含 java 二进制文件、库、配置等的 ZIP - 但它被记录为与对某些外来 API 的 HTTP 调用一起使用。

最后我深入研究了maven插件的来源来了解部署是如何发生的。由于我们目前在 null_resource 的帮助下通过 func 进行部署,我没有完成如何使用terraform only部署的研究。我深入研究了功能部署的maven插件源并停在这里:https://github.com/microsoft/azure-maven-plugins/blob/b260278dff807794f2d7e2781a6fd4d212337ab0/azure-toolkit-libs/azure-toolkit-appservice-lib/src/main/java/com/microsoft/azure/toolkit/lib/appservice/function/FunctionAppBase.java#L55 。这揭示了target/azure-functions/<project_name>下的完整目录内容将被压缩,上传到函数的存储帐户,并且将设置函数应用程序中的一些属性,具体为 WEBSITE_RUN_FROM_PACKAGE .

我建议您使用 Maven 插件打包函数应用程序,使用插件或函数核心工具进行部署,并在 azure 门户上检查函数应用程序云资源的状态,以对官方 azure 文档缺少的内容进行逆向工程.

关于通过 terraform azurerm_function_app_function 的 Azure 函数抛出 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71849412/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com