Я сейчас играюсь с Java ServiceLoader. Теперь моя проблема заключается в том, как загрузить Сервисы из нескольких проектов.
У меня есть один большой Maven-Project, и все реализации находятся в папке bundles. Теперь в ProjectA я хочу загрузить сервисы, которые находятся в Project B и / или Project C. В настоящее время я даже не могу загрузить Сервисы только из одного другого Проекта. Загрузка услуг из ProjectA работает, хотя. Я получаю сообщение об ошибке:
org.eclipse.swt.SWTException: Failed to execute runnable (java.util.ServiceConfigurationError: myPackageA.MyProvider: Provider myPackageB.myProviderImplementation not Found)
Caused by: java.util.ServiceConfigurationError: myPackageA.MyProvider: Provider myPackageB.myProviderImplementation not found
Моя структура папок выглядит следующим образом:
MainProject
|
|_ ...
|_ bundles
|_ ProjectA
| |_ myPackageA
| |_ MyProvider
|_ ProjectB
| |_ myPackageB
| | |_ myProviderImplementation
| |_META-INF
| |_ services
| |_ myPackageA.MyProvider
...
Я пытался создать META-INF / services в пакетах, но это ничего не меняет ( то же сообщение об ошибке). Я могу получить доступ к Сервисам, которые я поместил в ProjectA, просто используя ServiceLoader.load (MyProvider.class). Но если я предоставлю ServiceLoader URL-ClassLoader, который указывает на «C: \ .. \ MainProject \ bundles \ ProjectB \, я получу сообщение об ошибке. (Это также не работает, если я указываю на ProjectA для загрузки сервисы оттуда.)
File loc1 = new File("C:\\..\\MainProject\\bundles\\ProjectB\\");
URL[] urls = new URL[] {loc1.toURI().toURL()};
URLClassLoader uClassLoader = URLClassLoader(urls);
ServiceLoader<MyProvider> analysisServices = ServiceLoader.load(MyProvider.class, uClassLoader);
Ранее я пытался использовать URL-ClassLoader для загрузки реализаций из jar, но это дало мне ClassPathError, поэтому я перестал пытаться после нескольких дней отладки.