У меня проблемы с использованием java ServiceLoader в модульном приложении NetBeans.Вот что я пытаюсь сделать (и это работает в обычном Java-приложении в Eclipse):
У меня есть interface.jar, который объявляет интерфейс.И у меня есть файл реализаций.jar, в котором есть несколько реализаций этого интерфейса, все они указаны в файле spi / META-INF / services / my.package.name.MyInteface (этот файл находится в файле реализаций.jar).
У меня также есть класс PracticeHandler (в еще одном handler.jar), который имеет следующий метод для загрузки всех реализаций:
private static List<MyInterface<?>> loadAllImplementations() {
List<MyInterface<?>> foundImplementations = Lists.newArrayList();
try {
for (MyInterface implementation : ServiceLoader.load(MyInterface.class)) {
foundImplementations.add(implementation);
}
} catch (ServiceConfigurationError error) {
system.out.println("Exception happened");
}
return foundImplementations;
}
Этот код возвращает все реализации в обычном приложении Eclipse (foundImplementations.size()> 0).
Однако в NetBeans он ничего не может найти (foundImplementations.size () == 0).
Подробнее:
У меня есть источникприложение модуля NetBeans (с открытым исходным кодом, не написанное мной), которое мне необходимо расширить с помощью некоторых реализаций MyInterface.Интерфейс.jar, Implementations.jar и Handler.jar создаются в Eclipse и являются частью другого приложения.
В NetBeans я открыл модуль, который должен использовать новые имплементации, и добавил все свои 3 банки в качестве внешних библиотек (NetBeans скопировал их в свою папку ext, которую я не хочу, но могу »ничего не поделать - я хочу, чтобы они были в другой папке myext, но это уже другая история).Затем я перестроил все и попытался использовать одну из моих реализаций, но она не была найдена ... Код, который получает реализацию, находится в классе ImplementHandler и выглядит так:
public static final <T> MyInteface<T> getByName(String name) {
for (MyInteface implementation : loadAllImplementations()) {
if (implementation.getName().equals(name)) {
return implementation;
}
}
throw new IllegalArgumentException("Unable to find MyInterface class for: " + name);
}
Я получил свое исключение "Не удалось найти класс MyInteface для: myImplementationName "...
Мои знания о NetBeans очень ограничены, и мне было интересно, есть ли что-то еще, что мне нужно сделать, чтобы это работало?