clarify azure main-class and boot plugin configuraitons

This commit is contained in:
Christian Tzolov
2023-07-21 19:53:13 +02:00
parent fd9b6d5e8f
commit 27694da481

View File

@@ -98,6 +98,8 @@ TIP: Use the Java annotations included in the https://learn.microsoft.com/en-us/
The implementation of the business logic used inside the Azure handlers looks like a common Spring application:
[[HttpTriggerDemoApplication]]
[source,java]
----
@SpringBootApplication // <1>
@@ -130,7 +132,7 @@ For that purpose the `AzureFunctionUtil.enhanceInputIfNecessary` allow you to ad
[source,java]
----
@FunctionName("myazurefunction")
@FunctionName("myfunction")
public String execute(
@HttpTrigger(name = "req", authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
ExecutionContext context) {
@@ -163,7 +165,7 @@ public Function<Message<String>, String> uppercase(JsonMapper mapper) {
In order to run Spring Cloud Function applications on Microsoft Azure, you have to use the Maven or Gradle plugins offered by Azure.
Later imposes a specific https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-java?tabs=bash%2Cconsumption#folder-structure[package archive structure] that interferes with the `standard` Spring Boot package jars.
The <<disable-spring-boot-layout,Disable Spring Boot Layout>> section below explains how to handle this.
The <<disable-spring-boot-plugin,Disable Spring Boot Plugin>> section below explains how to handle this.
You have to provide Azure specific configurations such as the `resourceGroup`, `appName` and other optional properties.
More information about the runtime configurations: https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-java?tabs=bash%2Cconsumption#java-versions[Java Versions], https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-java?tabs=bash%2Cconsumption#specify-the-deployment-os[Deployment OS].
@@ -249,17 +251,33 @@ azurefunctions {
The complete plugin documentation is available at the https://github.com/microsoft/azure-maven-plugins/tree/develop/azure-functions-maven-plugin[Azure Maven] and https://github.com/microsoft/azure-gradle-plugins/tree/master/azure-functions-gradle-plugin[Azure Gradle] repositories.
==== Disable Spring Boot Layout
==== Disable Spring Boot Plugin
The Azure Functions come with their own (non-Boot) execution runtime that imposes its own packaging format generated by the Azure's maven/gradle plugins.
Therefore we can't use the (standard) Spring Boot packaging.
You have to either disable the Spring-Boot plugin all together or opt for the https://github.com/dsyer/spring-boot-thin-launcher[spring-boot-thin-launcher] instead.
This https://github.com/spring-cloud/spring-cloud-function/blob/3bafcc59175fb61e323e393487d413441287a450/spring-cloud-function-samples/function-sample-azure-http-trigger/pom.xml#L97-L107[snipped] illustrates how to use the `spring-boot-thin-launcher` for Maven.
Expectedly, the Azure Functions run inside the Azure execution runtime, not inside the SpringBoot runtime!
Furthermore, Azure expects a specific packaging format, generated by the Azure Maven/Gradle plugins, that is not compatible with the default Spring Boot packaging.
==== Provide Main-Class
IMPORTANT: You have to either disable the SpringBoot Maven/Gradle plugin or use the https://github.com/dsyer/spring-boot-thin-launcher[Spring Boot Thin Launcher] as shown in this Maven snipped:
[source,xml]
----
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
</dependency>
</dependencies>
</plugin>
----
[[star-class-configuration]]
Next you must specify the `Start-Class` or `Main-Class` to point to your application main class.
==== Main-Class Configuration
Specify the `Main-Class`/`Start-Class` to point to your Spring application entry point, such as the <<HttpTriggerDemoApplication,HttpTriggerDemoApplication>> class in the example above.
You can use the Maven `start-class` property or set the `Main-Class` attribute of your `MANIFEST/META-INFO`:
====
[source,xml,indent=0,subs="verbatim,attributes",role="primary"]
@@ -284,23 +302,11 @@ jar {
----
====
Alternatively you can explicitly set the main class using the `MAIN_CLASS` environment variable.
TIP: Alternatively you can use the `MAIN_CLASS` environment variable to set the class name explicitly.
For local runs, add the `MAIN_CLASS` variable to your `local.settings.json` file and for Azure portal deployment set the variable in the https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#get-started-in-the-azure-portal[App Settings].
For local runs, you can set the `MAIN_CLASS` in your the `local.settings.json`:
[source,json]
----
{
"IsEncrypted": false,
"Values": {
... ,
"MAIN_CLASS": "YOUR-APP-MAIN-CLASS"
}
}
----
IMPORTANT: When not set via the `MAIN_CLASS` variable, the Azure adapter will try to retrieve the main class from the `MANIFEST/META-INFO` sections of all dependencies.
The first main class annotated with a `@SpringBootApplication` or `@SpringBootConfiguration` is selected.
IMPORTANT: If the `MAIN_CLASS` variable is not set, the Azure adapter lookups the `MANIFEST/META-INFO` attributes from the jars found on the classpath and selects the first `Main-Class:` annotated with either a `@SpringBootApplication` or `@SpringBootConfiguration` annotation.
==== Configuration Metadata