我正在将module-info.java
添加到Ikonli软件包中,并且它们的服务类遇到了麻烦。 ikonli-core
定义了一个名为IkonHandler
的接口。 ikonli-fontawesome5-pack
的IkonHandler
具有a service provider称为FontAwesomeSolidIkonHandler
。这些服务提供者由ikonli-javafx
的IkonResolver
使用。
鉴于此,我创建了以下模块定义:
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
为空。 HANDLERS
是loaded 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;