我的工作区中有四个 Eclipse 插件项目(创建一个新的 Java 项目,右键单击,配置,转换为插件项目)。第一个 ( my.runtime
) 包含一个接口 ( MyFactoryInterface
) 和一个类 ( MyClient
),该类定义了一个方法 ( List<String> getAllFactoryNames()
),该方法 ( ) 通过加载该接口的所有实现java.util.ServiceLoader
并在它们上调用方法 ( String getName()
),收集结果并在列表中返回它们。
为了测试该类,我在第二个项目中进行了 JUnit 测试(my.runtime.test
设置my.runtime
为 Fragment-Host),检查项目中的虚拟实现(MyDummy
返回"Dummy"
)返回的名称是否在返回my.runtime.test
的列表中MyClient.getAllFactoryNames()
。到目前为止,它工作正常。
在第三个项目(my.extension
,my.runtime
作为依赖项)中,我有一个类(MyHello
),它使用返回的名称MyClient.getAllFactoryNames()
来返回问候列表("Hello "+name
)。
同样,为了测试这一点,我有一个项目(作为 Fragment-Host),其中包含另一个实现(my.extension.test
作为名称返回)和一个 JUnit 测试用例检查是否在返回的问候语中。该测试失败,因为 MyClient 仍然只找到实现,而不是实现。这两种实现都伴随着文件中的匹配条目。my.extension
MyWorld
"World"
"Hello World"
MyHello.getGreetings()
MyDummy
MyWorld
META-INF/services/my.runtime.MyFactoryInterface
我目前使用以下代码来加载实现:
ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
for (MyFactoryInterface myFactory : myFactoryLoader) {
我知道我可以提供一个 ClassLoader 作为第二个参数ServiceLoader.load
,但我不知道如何获得一个知道所有插件项目的...有什么建议吗?或者 ServiceLoader 不是解决这个问题的正确工具?