使用2个补充模块让一个简单的ServiceLoader在Java中工作
我对使用ServiceLoader还相当陌生,我正在尝试创建一个非常简单的示例并运行它 目前有4个模块:BLCore、BLInterface、BLMod1、BLMod2使用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
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
- 在
配置(Maven、Gradle甚至您的IDE)中,必须确保引用BLCore
和BLMod1
:在执行main时,它必须在类路径中可用BLMod2
- 确保
和Module1
具有公共构造函数Module2
模块信息中添加适当的行。Java
:
module com.example.module1 {
provides com.example.BeanInterface
with com.example.Module1;
}
这就是软件包有用的地方:如果没有合适的软件包,您可能无法使用模块
您可能还需要阅读Javadoc:谢谢,我将在明天阅读它(链接)。我试着按照你的例子让它工作,但没能让它工作。但是我需要更多地理解module-info.java文件,我相信这些文件目前会给我带来错误。我很确定问题出在module-info上。好的,我已经清理了它,并删除了maven和module.info文件中的所有错误。它没有错误,但似乎不起作用,我确信我遗漏了一个小细节。如果您仍然可以,我已在上面添加了一个新图像。:-)请看我的答案:您的模块信息(在BLMod1/BLMod2中)必须说明它提供了什么。您是对的!一开始无法让它工作,但现在情况很好。非常感谢你的帮助!