99import java .lang .reflect .Modifier ;
1010import java .util .Arrays ;
1111import java .util .Comparator ;
12+ import java .util .Objects ;
1213import java .util .Optional ;
14+ import java .util .ServiceConfigurationError ;
1315import java .util .ServiceLoader ;
1416import java .util .stream .Stream ;
1517
@@ -47,7 +49,8 @@ public static <T> Stream<T> loadAll(Class<T> clazz) {
4749 .filter (IntegrationsLoader ::isSupportedOperatingSystem )
4850 .filter (IntegrationsLoader ::passesStaticAvailabilityCheck )
4951 .sorted (Comparator .comparingInt (IntegrationsLoader ::getPriority ).reversed ())
50- .map (ServiceLoader .Provider ::get )
52+ .map (IntegrationsLoader ::instantiateServiceProvider )
53+ .filter (Objects ::nonNull )
5154 .filter (IntegrationsLoader ::passesInstanceAvailabilityCheck )
5255 .peek (impl -> logServiceIsAvailable (clazz , impl .getClass ()));
5356 }
@@ -68,18 +71,37 @@ private static boolean isSupportedOperatingSystem(ServiceLoader.Provider<?> prov
6871 return annotations .length == 0 || Arrays .stream (annotations ).anyMatch (OperatingSystem .Value ::isCurrent );
6972 }
7073
74+ private static <T > T instantiateServiceProvider (ServiceLoader .Provider <T > provider ) {
75+ try {
76+ return provider .get ();
77+ } catch (ServiceConfigurationError err ) {
78+ LOG .warn ("Unable to load service provider {}." , provider .type ().getName (), err );
79+ return null ;
80+ }
81+ }
82+
7183 private static boolean passesStaticAvailabilityCheck (ServiceLoader .Provider <?> provider ) {
7284 return passesStaticAvailabilityCheck (provider .type ());
7385 }
7486
7587 @ VisibleForTesting
7688 static boolean passesStaticAvailabilityCheck (Class <?> type ) {
77- return passesAvailabilityCheck (type , null );
89+ try {
90+ return passesAvailabilityCheck (type , null );
91+ } catch (ExceptionInInitializerError | NoClassDefFoundError | RuntimeException t ) {
92+ LOG .warn ("Unable to load service provider {}." , type .getName (), t );
93+ return false ;
94+ }
7895 }
7996
8097 @ VisibleForTesting
8198 static boolean passesInstanceAvailabilityCheck (Object instance ) {
82- return passesAvailabilityCheck (instance .getClass (), instance );
99+ try {
100+ return passesAvailabilityCheck (instance .getClass (), instance );
101+ } catch (RuntimeException rte ) {
102+ LOG .warn ("Unable to load service provider {}." , instance .getClass ().getName (), rte );
103+ return false ;
104+ }
83105 }
84106
85107 private static void logServiceIsAvailable (Class <?> apiType , Class <?> implType ) {
0 commit comments