diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java index c1420ba6bd..1cbd342646 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java @@ -168,6 +168,7 @@ import org.springframework.util.function.ThrowingSupplier; * @author Chris Bono * @author Moritz Halbritter * @author Tadaya Tsuyukubo + * @author Yanming Zhou * @since 1.0.0 * @see #run(Class, String[]) * @see #run(Class[], String[]) @@ -436,6 +437,10 @@ public class SpringApplication { initializers.stream().filter(AotApplicationContextInitializer.class::isInstance).toList()); if (aotInitializers.isEmpty()) { String initializerClassName = this.mainApplicationClass.getName() + "__ApplicationContextInitializer"; + Assert.state(ClassUtils.isPresent(initializerClassName, getClassLoader()), + "You are starting the application with AOT mode enabled but AOT processing hasn't happened. " + + "Please build your application with enabled AOT processing first, " + + "or remove the system property 'spring.aot.enabled' to run the application in regular mode"); aotInitializers.add(AotApplicationContextInitializer.forInitializerClasses(initializerClassName)); } initializers.removeAll(aotInitializers); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java index 877433d23b..1fff2bf294 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java @@ -163,6 +163,7 @@ import static org.mockito.Mockito.spy; * @author Sebastien Deleuze * @author Moritz Halbritter * @author Tadaya Tsuyukubo + * @author Yanming Zhou */ @ExtendWith(OutputCaptureExtension.class) class SpringApplicationTests { @@ -1375,6 +1376,21 @@ class SpringApplicationTests { } } + @Test + void shouldReportFriendlyErrorIfAotInitializerNotFound() { + SpringApplication application = new SpringApplication(TestSpringApplication.class); + application.setWebApplicationType(WebApplicationType.NONE); + application.setMainApplicationClass(TestSpringApplication.class); + System.setProperty(AotDetector.AOT_ENABLED, "true"); + try { + assertThatIllegalStateException().isThrownBy(application::run) + .withMessageContaining("but AOT processing hasn't happened"); + } + finally { + System.clearProperty(AotDetector.AOT_ENABLED); + } + } + @Test void fromRunsWithAdditionalSources() { assertThat(ExampleAdditionalConfig.local.get()).isNull();