【问题标题】:Getting a simple ServiceLoader to work in Java using 2 supplementary Modules使用 2 个补充模块让一个简单的 ServiceLoader 在 Java 中工作
【发布时间】:2021-03-26 23:57:52
【问题描述】:

我对使用 ServiceLoader 还很陌生,我正在尝试启动并运行一个非常简单的示例。

目前有 4 个模块:BLCore、BLInterface、BLMod1、BLMod2

BLCore depends on: BLInterface, BLMod1, BLMod2
BLInterface depends on: Nonne
BLMod1 depends on: BLInterface
BLMod2 depends on: BLInterface

BLCore包含main方法,包含以下内容:

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
        for(BeanInterface val : ServiceLoader.load(BeanInterface.class)){
            System.out.println("You are a "+val.getName());
        }
    }
}

而且 BLInterface 有一个 String 方法,它只打印出一个名称左右。

结构如下:

代码可以编译,但是ServiceLoader没有检测到Module1和Module2,有什么想法吗?

----状态---- 所有错误均已删除,但仍无法正常工作。

【问题讨论】:

    标签: java spi serviceloader


    【解决方案1】:

    您应该使用包而不是默认包。例如com.example

    在 Java 8 中(不包括模块引起的问题):

    • BLMod1项目中,META-INF/services/com.example.BeanInterface必须包含com.example.Module1
    • BLMod2 项目中,META-INF/services/com.example.BeanInterface 必须包含com.example.Module2
    • BLCore 配置(Maven、Gradle 甚至您的 IDE)中,您必须确保引用 BLMod1BLMod2:当您执行 main 时,它必须在类路径中可用。
    • 确保Module1Module2 具有公共构造函数。

    如果您使用的是 Java 9++,您可能还需要在 module-info.java 中添加适当的行:

    module com.example.module1 {      
      provides com.example.BeanInterface
          with com.example.Module1;
    }
    

    这就是包有用的地方:如果没有合适的包,您可能无法使用模块。

    您可能还想阅读 Javadoc:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html

    【讨论】:

    • 谢谢,我明天会读完(链接)。我试图按照您的示例使其正常工作,但无法正常工作。但我需要更多地了解 module-info.java 文件,因为这些文件目前给了我错误。
    • 我很确定你的问题出在哪里,模块信息。
    • 好的,我已经清理了一下,并从 maven 和 module.info 文件中删除了所有错误。它没有给出任何错误,但它似乎不起作用,我确信我错过了一个小细节。如果您仍然可以,我在上面添加了一张新图片。 :-)
    • 查看我的答案:您的模块信息(在 BLMod1/BLMod2 中)必须说明它提供了什么。
    • 你是对的!起初无法让它工作,但现在它清理得很好。非常感谢您的帮助!
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多