【发布时间】:2012-10-26 14:49:30
【问题描述】:
我想构建一个可以用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 文件在构建路径中,则可以通过调用来加载插件
Iterator<PluginService> it = ServiceLoader.load(PluginService.class).iterator();
该迭代器也可以让您访问ServiceLoader 找到的所有插件。
出于某种原因,Gradle 默认不将文件包含到 META-INF 目录中。有没有办法让生成的 JAR 包含这样的文件?
我已经在Jar 类中找到了方法metaInf。但我不知道 groovy 足够好,无法自己找到解决方案。
【问题讨论】:
-
你确定吗?对我来说很好。你到底把这个文件放在哪里?你的
build.gradle看起来怎么样? -
在主源文件夹
src/main/java中有一个META-INF目录。构建脚本没有什么特别之处。它几乎是一个标准的,包含一些额外的依赖项和一些自定义存储库。