我正在将module-info.java添加到Ikonli软件包中,并且它们的服务类遇到了麻烦。 ikonli-core定义了一个名为IkonHandler的接口。 ikonli-fontawesome5-packIkonHandler具有a service provider称为FontAwesomeSolidIkonHandler。这些服务提供者由ikonli-javafxIkonResolver使用。

鉴于此,我创建了以下模块定义:

module org.kordamp.ikonli.core {
    exports org.kordamp.ikonli;
}

module org.kordamp.ikonli.javafx {
    exports org.kordamp.ikonli.javafx;
    uses org.kordamp.ikonli.IkonHandler;
    requires javafx.graphics;
    requires org.kordamp.ikonli.core;
}

module org.kordamp.ikonli.fontawesome5 {
    exports org.kordamp.ikonli.fontawesome5;
    provides org.kordamp.ikonli.IkonHandler with org.kordamp.ikonli.fontawesome5.FontAwesomeBrandsIkonHandler, org.kordamp.ikonli.fontawesome5.FontAwesomeRegularIkonHandler, org.kordamp.ikonli.fontawesome5.FontAwesomeSolidIkonHandler;
    requires org.kordamp.ikonli.core;
    requires org.kordamp.jipsy;
}


它们可能不完整,但是足够完整,因此当我的应用程序启动时,它会因以下错误而失败:

java.lang.UnsupportedOperationException: Cannot resolve 'fas-user'


当没有处理程序设法load the icon时抛出该异常:

public IkonHandler resolveIkonHandler(String value) {
    requireNonNull(value, "Ikon description must not be null");
    for (IkonHandler handler : HANDLERS) {
        if (handler.supports(value)) {
            return handler;
        }
    }
    throw new UnsupportedOperationException("Cannot resolve '" + value + "'");
}


发生这种情况的原因是HANDLERS为空。 HANDLERSloaded at startup by this code

    ClassLoader classLoader = IkonResolver.class.getClassLoader();
    ServiceLoader<IkonHandler> loader = ServiceLoader.load(IkonHandler.class, classLoader);
    for (IkonHandler handler : loader) {
        HANDLERS.add(handler);
        handler.setFont(Font.loadFont(classLoader.getResource(handler.getFontResourcePath()).toExternalForm(), 16));
    }


但是使用上面引用的模块定义,ServiceLoader.load(IkonHandler.class, classLoader)找不到任何服务提供者。

我想念什么?

最佳答案

我所缺少的是在应用程序的fontawesome5中需要module-info.java

requires org.kordamp.ikonli.fontawesome5;

07-24 13:16