From e6c0152916806905dcdf106798de0b475391f830 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 11 May 2022 12:11:14 +0200 Subject: [PATCH] Force AOT resolution of Spring Factories constructors This commit forces the resolution of all declared constructors when registering `RuntimeHints` for Spring factories. Resolving constructors can throw additional `NoClassDefFoundError` at runtime and during native image compilation, if a type exposed by the constructor is missing from the current classloader. See gh-27955 --- .../SpringFactoriesLoaderRuntimeHintsRegistrar.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoaderRuntimeHintsRegistrar.java b/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoaderRuntimeHintsRegistrar.java index 56c62667ed7..dbdccaa4885 100644 --- a/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoaderRuntimeHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/core/io/support/SpringFactoriesLoaderRuntimeHintsRegistrar.java @@ -16,6 +16,7 @@ package org.springframework.core.io.support; +import java.lang.reflect.Constructor; import java.util.List; import java.util.Map; import java.util.function.Consumer; @@ -88,9 +89,12 @@ class SpringFactoriesLoaderRuntimeHintsRegistrar implements RuntimeHintsRegistra @Nullable private Class resolveClassName(ClassLoader classLoader, String factoryClassName) { try { - return ClassUtils.resolveClassName(factoryClassName, classLoader); + Class className = ClassUtils.resolveClassName(factoryClassName, classLoader); + // Force resolution of all constructors to catch + Constructor[] constructors = className.getDeclaredConstructors(); + return className; } - catch (Exception ex) { + catch (Throwable ex) { return null; } }