У меня есть четыре проекта плагинов Eclipse (создайте новый проект Java, щелкните правой кнопкой мыши, настройте, преобразуйте в проект плагина) в моей рабочей области.Первый (my.runtime
) содержит интерфейс (MyFactoryInterface
) и класс (MyClient
), который определяет метод (List<String> getAllFactoryNames()
), который загружает все реализации этого интерфейса через java.util.ServiceLoader
и вызывает метод (String getName()
).*) для них, собирая результаты и возвращая их в виде списка.
Чтобы протестировать этот класс, у меня есть тест JUnit во втором проекте (my.runtime.test
, настроенный с my.runtime
как Fragment-Host), проверяя, находится ли имя, возвращаемое фиктивной реализацией (MyDummy
, возвращающее "Dummy"
), которое у меня есть в проекте my.runtime.test
, в списке, возвращаемом MyClient.getAllFactoryNames()
.Пока все работает нормально.
В третьем проекте (my.extension
, с my.runtime
в качестве зависимости) у меня есть класс (MyHello
), который использует имена, возвращаемые MyClient.getAllFactoryNames()
, чтобы вернутьсписок приветствий ("Hello "+name
).
Опять же, чтобы проверить это, у меня есть проект (my.extension.test
, с my.extension
в качестве Fragment-Host), содержащий другую реализацию (MyWorld
, возвращающая * 1027)* как имя) и тестовый пример JUnit, проверяющий, присутствует ли "Hello World"
в приветствиях, возвращенных MyHello.getGreetings()
.Этот тест не пройден, поскольку MyClient все еще находит реализацию MyDummy
, а не реализацию MyWorld
.Обе реализации сопровождаются соответствующими записями в META-INF/services/my.runtime.MyFactoryInterface
файлах.
В настоящее время я использую следующий код для загрузки реализаций:
ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
for (MyFactoryInterface myFactory : myFactoryLoader) {
Я знаю, что могу предоставить ClassLoader в качестве второгоаргумент ServiceLoader.load
, но я понятия не имею, как получить тот, который знает все проекты плагинов ... какие-либо предложения?Или ServiceLoader не подходит для этой проблемы?