使用新的Java模块系统加载服务提供程序我还缺少什么? [英] What else am I missing to load service providers using the new Java module system?

查看:172
本文介绍了使用新的Java模块系统加载服务提供程序我还缺少什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将 module-info.java 添加到 Ikonli 软件包,我的服务类遇到了麻烦。 ikonli-core 定义一个名为 IkonHandler ikonli-fontawesome5-pack IkonHandler 的服务提供商 a href =https://github.com/aalmiray/ikonli/blob/master/subprojects/ikonli-fontawesome5-pack/src/main/java/org/kordamp/ikonli/fontawesome5/FontAwesomeSolidIkonHandler.java =nofollow noreferrer> FontAwesomeSolidIkonHandler 。这些服务产品由 ikonli-javafx 使用 IkonResolver

I'm adding module-info.javas to Ikonli packages and I'm running into trouble with their service classes. ikonli-core defines an interface called IkonHandler. ikonli-fontawesome5-pack has a service provider for the IkonHandler called FontAwesomeSolidIkonHandler. These service prodivers are used by ikonli-javafx's IkonResolver.

鉴于此,我创建了这些模块定义:

Given this, I created these module definitions:

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;
}

它们可能不完整,但它们足够完整,以便在申请时启动,它失败并出现此错误:

They might not be complete, but they are complete enough so that when my application starts, it fails with this error:

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

当没有处理程序设法加载图标

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 在启动时通过此代码加载

The reason why that is happening is that HANDLERS is empty. HANDLERS is 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)找不到服务提供商。

but with the module definitions quoted above, ServiceLoader.load(IkonHandler.class, classLoader) finds no service providers.

我缺少什么?

推荐答案

我缺少的是 module-info.java中需要 fontawesome5 我的申请:

What I was missing was requiring fontawesome5 in the module-info.java of my application:

requires org.kordamp.ikonli.fontawesome5;

这篇关于使用新的Java模块系统加载服务提供程序我还缺少什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆