Я пытаюсь запустить службу из модуля, но появляется следующая ошибка:
Exception in thread "main" java.util.ServiceConfigurationError: com.example.prototype.api.Service: Provider com.example.prototype.foo.FooService not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at java.lang.Iterable.forEach(Iterable.java:74)
at com.example.prototype.api.Main.main(Main.java:19)
Подход и описание архитектуры:
Я хотел бы иметь приложение с модулями, где один модуль описывает интерфейсы, а другой реализует его. Идея состоит в том, что интерфейсный модуль не должен ничего знать о конкретной реализации.
База кодов расположена на github .
Примечания:
api-module
имеет интерфейс Service
. Кроме того, он имеет класс Main
, который создает экземпляр foo-module
с реализацией вызывающей службы.
foo-module
имеет реализацию интерфейса Service
.
API-модуль Основной класс:
public class Main {
public static void main(String[] args) throws Throwable {
File root = new File("prototype");
ModuleLoader loader = new ModuleLoader(new LocalModuleFinder(new File[]{root}));
Module module = loader.loadModule("com.example.prototype.foo");
ServiceLoader<Service> services = module.loadService(Service.class);
System.out.println("Foo Service loaded");
services.forEach(Service::sayWhatsup);
System.out.println("Done!");
}
}
Модуль Foo module.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.8" name="com.example.prototype.foo" version="1.0">
<main-class name="com.example.prototype.foo.Main"/>
<resources>
<artifact name="com.example.prototype:foo-module:1.0"/>
</resources>
<dependencies>
<module name="com.example.prototype.api"/>
</dependencies>
<provides>
<service name="com.example.prototype.api.Service">
<with-class name="com.example.prototype.foo.FooService"/>
</service>
</provides>
</module>
Насколько я понимаю, Service.class
и FooService
имеют разные загрузчики классов, и это потому, что возникает проблема совместимости классов.
Пожалуйста, помогите решить эту проблему. Заранее спасибо!