微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ServiceConfigurationError: 不是子类型

如何解决ServiceConfigurationError: 不是子类型

我一直在从事一个相当复杂的项目。它涉及 2 个模块,net.lightbluefoxlabs.dev.multirealm.core.multirealmcorenet.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 举报,一经查实,本站将立刻删除。