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

Getting a simple ServiceLoader to work in Java using 2 supplementary Modules

我对使用 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,有什么想法吗?

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

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

在Java8(排除模块问题):

  • 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.
  • 时在 class 路径中可用
  • 确保 Module1Module2 有一个 public 构造函数。

如果您使用的是 Java 9++,您可能还需要在 module-info.java:

中添加适当的行
module com.example.module1 {      
  provides com.example.BeanInterface
      with com.example.Module1;
}

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

您可能还想为此阅读 Java文档:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ServiceLoader.html