From 8126d2652dc22c7459546854a3ea0041af011df6 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 3 Nov 2023 10:31:30 +0800 Subject: [PATCH 1/2] Report friendly error when failing to find AOT initializer See gh-38188 --- .../springframework/boot/SpringApplication.java | 7 +++++++ .../boot/SpringApplicationTests.java | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) 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 c1420ba6bdf..c94427f0521 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,12 @@ public class SpringApplication { initializers.stream().filter(AotApplicationContextInitializer.class::isInstance).toList()); if (aotInitializers.isEmpty()) { String initializerClassName = this.mainApplicationClass.getName() + "__ApplicationContextInitializer"; + if (!ClassUtils.isPresent(initializerClassName, getClassLoader())) { + throw new IllegalArgumentException( + "You are starting application with AOT mode but not AOT-processed," + + " please build your application with AOT first." + + " Or remove system property 'spring.aot.enabled=true' to run as 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 877433d23b2..99bee2e963e 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 { + assertThatIllegalArgumentException().isThrownBy(application::run) + .withMessageContaining(AotDetector.AOT_ENABLED); + } + finally { + System.clearProperty(AotDetector.AOT_ENABLED); + } + } + @Test void fromRunsWithAdditionalSources() { assertThat(ExampleAdditionalConfig.local.get()).isNull(); From e3210e72d580ba48113501f83aa7547758c55d23 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Tue, 7 Nov 2023 10:36:38 +0100 Subject: [PATCH 2/2] Polish "Report friendly error when failing to find AOT initializer" See gh-38188 --- .../org/springframework/boot/SpringApplication.java | 10 ++++------ .../springframework/boot/SpringApplicationTests.java | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) 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 c94427f0521..1cbd3426465 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 @@ -437,12 +437,10 @@ public class SpringApplication { initializers.stream().filter(AotApplicationContextInitializer.class::isInstance).toList()); if (aotInitializers.isEmpty()) { String initializerClassName = this.mainApplicationClass.getName() + "__ApplicationContextInitializer"; - if (!ClassUtils.isPresent(initializerClassName, getClassLoader())) { - throw new IllegalArgumentException( - "You are starting application with AOT mode but not AOT-processed," - + " please build your application with AOT first." - + " Or remove system property 'spring.aot.enabled=true' to run as regular mode."); - } + 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 99bee2e963e..1fff2bf294e 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 @@ -1383,8 +1383,8 @@ class SpringApplicationTests { application.setMainApplicationClass(TestSpringApplication.class); System.setProperty(AotDetector.AOT_ENABLED, "true"); try { - assertThatIllegalArgumentException().isThrownBy(application::run) - .withMessageContaining(AotDetector.AOT_ENABLED); + assertThatIllegalStateException().isThrownBy(application::run) + .withMessageContaining("but AOT processing hasn't happened"); } finally { System.clearProperty(AotDetector.AOT_ENABLED);