diff --git a/core/trino-main/src/main/java/io/trino/server/PluginClassLoader.java b/core/trino-main/src/main/java/io/trino/server/PluginClassLoader.java index 370a0ae2e5f7..2851af510e95 100644 --- a/core/trino-main/src/main/java/io/trino/server/PluginClassLoader.java +++ b/core/trino-main/src/main/java/io/trino/server/PluginClassLoader.java @@ -99,7 +99,15 @@ protected Class loadClass(String name, boolean resolve) // If this is an SPI class, only check SPI class loader if (isSpiClass(name)) { - return resolveClass(spiClassLoader.loadClass(name), resolve); + try { + return resolveClass(spiClassLoader.loadClass(name), resolve); + } + catch (ClassNotFoundException e) { + if (hasClassLocally(name, resolve)) { + throw new ClassNotFoundException("SPI class '%s' was not found in the SPI classloader, but was found in the '%s' plugin classloader. Dependency providing this class should be added to the trino-spi provided scope.".formatted(name, pluginName), e); + } + throw new ClassNotFoundException("SPI class '%s' was not found in the SPI classloader. This is probably a bug in the dependencies.".formatted(name), e); + } } // Look for class locally @@ -115,6 +123,17 @@ private Class resolveClass(Class clazz, boolean resolve) return clazz; } + private boolean hasClassLocally(String name, boolean resolve) + { + try { + super.loadClass(name, resolve); + return true; + } + catch (Exception e) { + return false; + } + } + @Override public URL getResource(String name) {