diff --git a/api/src/main/java/jakarta/enterprise/inject/build/compatible/spi/BuildServicesResolver.java b/api/src/main/java/jakarta/enterprise/inject/build/compatible/spi/BuildServicesResolver.java index e5178faa..0b819539 100644 --- a/api/src/main/java/jakarta/enterprise/inject/build/compatible/spi/BuildServicesResolver.java +++ b/api/src/main/java/jakarta/enterprise/inject/build/compatible/spi/BuildServicesResolver.java @@ -12,12 +12,19 @@ import java.util.Collections; import java.util.Comparator; +import java.util.Objects; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; import java.util.Set; import java.util.TreeSet; -final class BuildServicesResolver { +/** + * An internal helper to resolve {@link BuildServices} implementations. + * This class is public only for integrators and should not be used by applications. + * + * @since 4.0 + */ +public final class BuildServicesResolver { private static final Object lock = new Object(); private static volatile Set discoveredBuildServices; private static volatile BuildServices configuredBuildServices; @@ -48,7 +55,7 @@ private static void discoverFactories() { BuildServices.class, BuildServicesResolver.class.getClassLoader()); if (!loader.iterator().hasNext()) { - throw new IllegalStateException("Unable to locate AnnotationBuilderFactory implementation"); + throw new IllegalStateException("Unable to locate BuildServices implementation"); } try { @@ -61,4 +68,16 @@ private static void discoverFactories() { BuildServicesResolver.discoveredBuildServices = Collections.unmodifiableSet(factories); } + + /** + * This method should not be used by applications. It is only exposed for integrators + * with complex classloading architectures, where service loader lookup doesn't work out of the box. + * With this method, an integrator may manually provide an instance of {@link BuildServices} and + * this class will no longer attempt to look it up using service loader. + * + * @param instance a {@link BuildServices} instance that should be used, must not be {@code null} + */ + public static void setBuildServices(BuildServices instance) { + configuredBuildServices = Objects.requireNonNull(instance, "BuildServices instance must not be null"); + } }