我想建立一个可以使用ServiceLoader
加载的插件模块。这需要在META-INF/services
目录下添加一个文件,文件名为服务接口的名称,并包含实现它的类的限定路径。然后,您可以通过调用ServiceLoader.load()
来加载这些服务。
以下是一个示例:
假设我们想提供一个名为org.example.plugins.PluginService
的插件接口。我们可以在org.example.plugins.impl.ExamplePlugin
类中提供此服务的实现。
如果我们想要一种插件机制,我们可以创建一个JAR文件,其中包含实现。该JAR文件还必须包含文件META-INF/services/org.example.plugins.PluginService
,并且该文件必须包含一行内容。
org.example.plugins.impl.ExamplePlugin
要让ServiceLoader
找到实现类,你需要将JAR文件加入到构建路径中。如果该JAR文件已经在构建路径中,你可以通过调用以下方法来加载插件:
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
那个迭代器将给您访问 ServiceLoader
找到的所有插件。
由于某种原因,默认情况下 Gradle 不会将文件包含在 META-INF
目录中。有没有办法让生成的 JAR 包含这样的文件?
我已经找到了类 Jar
中的 metaInf
方法。但是,我不够熟练使用 Groovy,无法自行找到解决方案。
build.gradle
是怎么样的呢? - axtavtsrc/main/java
中有一个META-INF
目录。构建脚本没有什么特别之处,几乎是标准的,包含一些额外的依赖项和一些自定义存储库。 - pvorb