首页 > 解决方案 > 使用 2 个补充模块让一个简单的 ServiceLoader 在 Java 中工作

问题描述

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

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

标签: javaspiserviceloader

解决方案


您应该使用包而不是默认包。例如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),您必须确保引用BLMod1and BLMod2:当您执行 main.xml 时,它必须在类路径中可用。
  • 确保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


推荐阅读