【发布时间】:2020-04-08 14:30:56
【问题描述】:
我找到了一个custom class loader,它按照儿童优先原则加载类。它工作正常,但我遇到了以下问题。 当我尝试加载使用 SPI 的类时,出现异常:
Exception in thread "main" java.util.ServiceConfigurationError: test.spi.SayMyNameProvider: test.spi.ImplProvider not a subtype
我使用以下模块创建了simple SPI project:spi-api、spi-impl 和 spi-app。
当我使用 URLClassLoader 时它可以工作,但是每当我使用 ChildFirstClassLoader 时,都会出现上述异常:
public class TestMain {
public static void main(String[] args) throws MalformedURLException {
//!!! comment ChildFirstClassLoader and uncomment URLClassLoader to get the correct behavior
ChildFirstClassLoader classLoader = getCustomClassLoader();
//URLClassLoader classLoader = getUrlClassLoader();
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
try {
List<SayMyNameProvider> providers = Speaker.providers();
for (SayMyNameProvider provider : providers) {
SayMyNameManager sayMyNameManager = provider.create();
sayMyNameManager.sayIt("main");
}
System.out.println("done");
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
private static ChildFirstClassLoader getCustomClassLoader() throws MalformedURLException {
URL[] urls = getUrls();
return new ChildFirstClassLoader(urls);
}
private static URLClassLoader getUrlClassLoader() throws MalformedURLException {
URL[] urls = getUrls();
return new URLClassLoader(urls);
}
private static URL[] getUrls() throws MalformedURLException {
File spiImpl = Paths.get("spi-impl", "target", "spi-impl-1.0.0-SNAPSHOT.jar").toFile();
File spiApi = Paths.get("spi-api", "target", "spi-api-1.0.0-SNAPSHOT.jar").toFile();
URL[] urls = new URL[2];
urls[0] = spiImpl.toURI().toURL();
urls[1] = spiApi.toURI().toURL();
return urls;
}
}
也许有人以前已经遇到过这个问题并且知道如何解决它。如果有任何帮助或建议,我将不胜感激。
【问题讨论】:
标签: java classloader serviceloader