Провайдеры не загружаются в загрузчик Java

Рейтинг: 0Ответов: 1Опубликовано: 29.01.2023

Я создал небольшую модульную службу. И у меня возникла проблема того что загрузчик не видит провайдеров:

ServiceLoader<BinFuncProvider> ldr = ServiceLoader.load(BinFuncProvider.class);

ldr в данном случае пустой. В файлах module-info все прописано вроде правильно.

Модуль который использует службу:

module appstart {
    requires appfuncs;
    requires userfuncs;
    uses binaryfuncs.BinFuncProvider;
}

Модуль службы:

module userfuncsimp {
    requires userfuncs;

    provides binaryfuncs.BinFuncProvider with
            binaryfuncsimp.AbsPlusProvider,
            binaryfuncsimp.AbsMinusProvider;
}

Программа работает таким образом, что будто бы строки

provides binaryfuncs.BinFuncProvider with
            binaryfuncsimp.AbsPlusProvider,
            binaryfuncsimp.AbsMinusProvider;

вовсе не существует.

При выполнении программы она работает не правильно. и в загузчике ldr в поле loadedProviders ничего нет.

код основной программы:

package mymodappdemo;

import java.util.ServiceLoader;

import simplefuncs.SimpleMathFuncs;
import binaryfuncs.*;
//import supportfuncs.SupportFuncs;

public class MyModAppDemo {
    public static void main(String[] args) {
// Сначала используются встроенные службы, как и прежде
        if (SimpleMathFuncs.isFactor(2, 10))
            System.out.println("2 является множителем 10");
        System.out.println("Наименьшим общим множителем для 35 и 105 будет " + SimpleMathFuncs.lcf(35, 105));
        System.out.println("Наибольшим общим множителем для 35 и 105 будет " + SimpleMathFuncs.gcf(35, 105));
        // Теперь используем основанные на службах
        // пользовательские операции.
        // Получение загрузчика службы для бинарных функций
        ServiceLoader<BinFuncProvider> ldr = ServiceLoader.load(BinFuncProvider.class);
        BinaryFunc binOp = null;

        // Поиск провайдера для функции absPlus и получение функции
        for (BinFuncProvider bfp : ldr) {
            System.out.println(bfp.toString());
            if (bfp.get().getName().equals("absPlus")) {
                binOp = bfp.get();
                break;
            }
        }
        if (binOp != null)
            System.out.println("Результат выполнения функции absPlus: " + binOp.func(12, -4));
        else
            System.out.println("Функция absPlus не найдена");
        binOp = null;
        // Теперь ищем провайдера для функции absMinus и получаем функцию
        for (BinFuncProvider bfp : ldr) {
            if (bfp.get().getName().equals("absMinus"))
                binOp = bfp.get();
            break;
        }

        if (binOp != null)
            System.out.println("Результат выполнения функции absMinus: " + binOp.func(12, -4));
        else
            System.out.println("Функция absMinus не найдена");
    }
}

Я полагаю что возможно в файлах module-info где-то есть ошибка но я не знаю какая.

Ответы

▲ 0

Вижу код из книжки Герберта Шилдта Java - полное руководство, раздел про модули. Коль сколько это так, то сообщаю вам, что код там полностью рабочий. Данный пример для проверки работоспособности необходимо компилировать из командной строки в той последовательности в которой это демонстрируется в книге. Так же из контекста вопроса вытекает то, что вы запускали отладку, и смотрели поле loadedProviders в ldr. Дело в том, что даже в работающем примере это поле пустое и равно нулю. Далее, если вы набирали код в какой либо IDE то для того чтобы этот код там заработал необходимо соблюсти условия запуска как из командной строки, строка запуска в конце примера вам в помощь.Демонстрация работоспособности кода