使用 location创建一个新的源文件夹src/main/resources
,然后在其中创建您的META-INF/services
文件夹并放入您的完全限定类名 (FQCN) 文件。这应该会自动将它们复制到 jar 文件中。因此,对于具有 FQCN 的接口的实现com.acme.MyInterface
,您将拥有:
Project
| src
| | main
| | java
| | [your source code]
| | resources
| | META-INF
| | services
| | com.acme.MyInterface
请注意,这com.acme.MyInterface
是文件的名称,而不是像 Java 包这样的目录结构。该文件的名称是您正在实现的接口的 FQCN,在其中,您将在自己的行上拥有每个实现的 FQCN,例如:
com.example.MyInterfaceImpl
com.example.AnotherMyInterfaceImpl
值得注意的是,这也适用于具有默认源集的 Gradle 项目。
完成此操作后,您可以使用以下命令加载接口的所有实现ServiceLoader
:
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface service : loader) {
// Prints com.example.MyInterfaceImpl and com.example.AnotherMyInterfaceImpl
System.out.println(service.class.getName());
}
需要注意的一些事项:
- 所有的实现都必须有一个无参数的构造函数
- 使用模块或自定义类加载器的应用程序可能必须使用
ServiceLoader.load
如果这些条件不适合您,那么您可能想要切换到另一个系统,例如像 Spring、EJB 等 CDI 风格的框架。