java - 使用 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---- 所有错误都已删除,但仍然无法正常工作。
解决方案
您应该使用包而不是默认包。例如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),您必须确保引用BLMod1
andBLMod2
:当您执行 main.xml 时,它必须在类路径中可用。 - 确保
Module1
并Module2
有一个公共构造函数。
如果您使用的是 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
推荐阅读
- javascript - document.getElementById 在 Google Web 应用程序中以一种奇怪的方式工作
- botframework - 如果聊天机器人闲置了几分钟,如何使用 Microsoft bot 框架版本 4 结束用户对话或会话?
- terraform - Terraform 有条件地应用生命周期块
- xamarin - 如何在 Xamarin.Forms 中设置 ContentPresenter 的文本颜色?
- elasticsearch - 对于 ElasticSearch match_phrase 查询,如何考虑词序但不要求所有搜索词都存在于文档中?
- python - Python:将字节数组转换为字节串奇怪的结果
- php - CloudStack API 签名请求 - PHP
- css - 为 fontawesome 和 Material 图标保持相同的图标大小
- firebase - Firebase vs BigQuery:不同的用户不匹配
- python-3.x - Hide button based on checkbox in odoo 12