使用2个补充模块让一个简单的ServiceLoader在Java中工作

使用2个补充模块让一个简单的ServiceLoader在Java中工作,java,spi,serviceloader,Java,Spi,Serviceloader,我对使用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方法,并包含以下内容: i

我对使用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有一个字符串方法,它只打印出一个名字左右

结构如下:

代码可以编译,但ServiceLoader没有检测模块1和模块2,有什么想法吗

----地位---- 已删除所有错误,但仍不工作


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

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

  • BLMod1
    项目中,
    META-INF/services/com.example.beainterface
    必须包含
    com.example.Module1
  • BLMod2
    项目中,
    META-INF/services/com.example.beainterface
    必须包含
    com.example.Module2
  • BLCore
    配置(Maven、Gradle甚至您的IDE)中,必须确保引用
    BLMod1
    BLMod2
    :在执行main时,它必须在类路径中可用
  • 确保
    Module1
    Module2
    具有公共构造函数
如果您使用的是Java 9++,您可能还需要在
模块信息中添加适当的行。Java

module com.example.module1 {      
  provides com.example.BeanInterface
      with com.example.Module1;
}
这就是软件包有用的地方:如果没有合适的软件包,您可能无法使用模块


您可能还需要阅读Javadoc:

谢谢,我将在明天阅读它(链接)。我试着按照你的例子让它工作,但没能让它工作。但是我需要更多地理解module-info.java文件,我相信这些文件目前会给我带来错误。我很确定问题出在module-info上。好的,我已经清理了它,并删除了maven和module.info文件中的所有错误。它没有错误,但似乎不起作用,我确信我遗漏了一个小细节。如果您仍然可以,我已在上面添加了一个新图像。:-)请看我的答案:您的模块信息(在BLMod1/BLMod2中)必须说明它提供了什么。您是对的!一开始无法让它工作,但现在情况很好。非常感谢你的帮助!