如何解决ServiceConfigurationError: 不是子类型
我一直在从事一个相当复杂的项目。它涉及 2 个模块,net.lightbluefoxlabs.dev.multirealm.core.multirealmcore
和 net.lbflabs.dev.realms.survivalrealm
,其中第一个模块有一个抽象类,它本身是从另一个类派生的(也许这就是问题所在?)。尝试为该类创建服务时,我收到此错误: java.util.ServiceConfigurationError: net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin: net.lbflabs.dev.realms.survivalrealm.SurvivalRealm not a subtype
即使它确实扩展了正确的类。这是加载服务的代码:
File file = new File("Dir/plugin_jar.jar");
urlclassloader c = new urlclassloader(new URL[]{file.getAbsoluteFile().toURI().toURL()});
ServiceLoader<LoadedRealmPlugin> loader = ServiceLoader.load(LoadedRealmPlugin.class,c);
LoadedRealmPlugin p = loader.iterator().next(); // Throws the exception
return p;
我已经简化了类和包/模块的名称,因为我的项目已经很大了,我认为没有必要。如果您需要任何其他信息,请询问。
编辑: 堆栈跟踪
[13:08:24] [Thread-9/WARN]: Exception in thread "Thread-9" java.util.ServiceConfigurationError: net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin: net.lbflabs.dev.realms.survivalrealm.SurvivalRealm not a subtype
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader.fail(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader$LazyClasspathLookupIterator.hasNextService(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader$LazyClasspathLookupIterator.hasNext(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader$2.next(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader$2.next(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at java.base/java.util.ServiceLoader$3.next(UnkNown Source)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin.RealmFactory(LoadedRealmPlugin.java:22)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin.RealmFactory(LoadedRealmPlugin.java:32)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.UnloadedRealm.GetLoadedRealm(UnloadedRealm.java:25)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.UnloadedRealm.Load(UnloadedRealm.java:39)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.RealmBase.Initialize(RealmBase.java:33)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.RealmBase.<init>(RealmBase.java:25)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.UnloadedRealm.<init>(UnloadedRealm.java:18)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.RealmManager.Initialize(RealmManager.java:25)
[13:08:24] [Thread-9/WARN]: at net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.RealmManager.lambda$InitializeAsync$0(RealmManager.java:42)
[13:08:24] [Thread-9/WARN]: at java.base/java.lang.Thread.run(UnkNown Source)
注意 A.ServiceTemplate 是 net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin 和 B.ServiceProvider 是 net.lbflabs.dev.realms.survivalrealm.SurvivalRealm
解决方法
Class
标识基于类的 FQN 和它正在加载的 ClassLoader
。
因此,在类加载器 1 中加载的类 net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin
与在类加载器 2 中加载的 net.lightbluefoxlabs.dev.multirealm.core.multirealmcore.Realms.LoadedRealmPlugin
是不同的类。您将获得 classcast 异常或不是子类型异常,因为它们不相同(来自JVM 的 pov)。
如 other question 中关于构建您自己的 ClassLoader
所述,您应该传递父 ClassLoader
。此 ClassLoader
应具有共享类,以允许构建正确的类层次结构。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。