Skip to content

Commit

Permalink
Clarify conditional support when using AOT
Browse files Browse the repository at this point in the history
  • Loading branch information
mhalbritter committed May 5, 2023
1 parent cd48252 commit 8a14f6d
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,6 @@ include::howto/testing.adoc[]

include::howto/build.adoc[]

include::howto/aot.adoc[]

include::howto/traditional-deployment.adoc[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
[[howto.aot]]
== Ahead-of-time processing

A number of questions often arise when people use the ahead-of-time processing of Spring Boot applications.
This section addresses those questions.

[[howto.aot.conditions]]
=== Conditions

Ahead-of-time processing optimizes the application and evaluates {spring-framework-api}/context/annotation/Conditional.html[conditions] based on the environment at build time.
<<features#features.profiles,Profiles>> are implemented through conditions and are therefore affected, too.

If you want beans that are created based on a condition in an ahead-of-time optimized application, you have to set up the environment when building the application.
The beans which are created while ahead-of-time processing at build time are then always created when running the application and can't be switched off.
To do this, you can set the profiles which should be used when building the application.

For Maven, this works by setting the `profiles` configuration of the `spring-boot-maven-plugin:process-aot` execution:

[source,xml,indent=0,subs="verbatim"]
----
<profile>
<id>native</id>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>process-aot</id>
<configuration>
<profiles>profile-a,profile-b</profiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
----

For Gradle, you need to configure the `ProcessAot` task:

[source,gradle,indent=0,subs="verbatim"]
----
tasks.withType(org.springframework.boot.gradle.tasks.aot.ProcessAot).configureEach {
args('--spring.profiles.active=profile-a,profile-b')
}
----

Profiles which only change configuration properties that don't influence conditions are supported without limitations when running ahead-of-time optimized applications.
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ A closed-world assumption implies the following restrictions:

* The classpath is fixed and fully defined at build time
* The beans defined in your application cannot change at runtime, meaning:
- The Spring `@Profile` annotation and profile-specific configuration is not supported
- The Spring `@Profile` annotation and profile-specific configuration <<howto#howto.aot.conditions,have limitations>>.
- Properties that change if a bean is created are not supported (for example, `@ConditionalOnProperty` and `.enable` properties).

When these restrictions are in place, it becomes possible for Spring to perform ahead-of-time processing during build-time and generate additional assets that GraalVM can use.
Expand Down

0 comments on commit 8a14f6d

Please sign in to comment.