1

我遇到了一个问题,我写了一个Class(EasybImpl)which implement EasybPlugin,但是当我迭代提供者时,我无法获得我写的 EasybImpl 支持。

我认为 EasybImpl 正在使用 System 类加载器和控制台 println 类加载器作为 sun.misc.Launcher$AppClassLoader。它出什么问题了。

    Iterator providers = ServiceRegistry.lookupProviders(EasybPlugin.class, 
                         ClassLoader.getSystemClassLoader());
4

2 回答 2

2

您是否将您的班级声明为服务提供者?

为了声明服务提供者,服务子目录被放置在每个 JAR 文件中的 META-INF 目录中。该目录包含每个服务提供者接口的文件,该接口在 JAR 文件中具有一个或多个实现类。例如,如果 JAR 文件包含一个名为 com.mycompany.mypkg.MyServiceImpl 的类,该类实现了 javax.someapi.SomeService 接口,则 JAR 文件将包含一个名为:

META-INF/services/javax.someapi.SomeService

包含以下行:

com.mycompany.mypkg.MyService

http://docs.oracle.com/javase/6/docs/api/javax/imageio/spi/ServiceRegistry.html

于 2012-07-18T06:40:56.313 回答
0

需要四个步骤:

  • 您将 META-INF/services 子目录构建到您的 JAR 文件中。
  • 在“服务”目录中,为您正在实施的每个服务创建一个文件。(在你的情况下,这将是 file META-INFA/services/my.package.EasybPlugin)。
  • 在该文件中,声明您的实现类的名称。
  • 然后,您可以使用java.util.ServiceLoaderAPI 来发现和加载已注册的服务。

服务提供者文件的示例:

# providers of EasyBPlugin SPI
# (comment lines begin with pound)
my.package.StandardEasybPlugin

然后,您可以像这样查找并加载服务实现:

ServiceLoader<EasybPlugin> loader = ServiceLoader.load(EasybPlugin.class);
for (EasybPlugin plugin : loader) {
    // ...
}

注 1:ServiceProvider您正在查看的 API 确实针对 Image IO,例如读取图像文件格式。ServiceLoader用于一般用途,除非您的目的不是阅读图像,否则应该首选。

这里有更详细的教程:http: //literatejava.com/extensibility/java-serviceloader-extensible-applications/

参考:

于 2016-04-21T22:48:10.897 回答