1

我的工作区中有四个 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.extensionmy.runtime作为依赖项)中,我有一个类(MyHello),它使用返回的名称MyClient.getAllFactoryNames()来返回问候列表("Hello "+name)。

同样,为了测试这一点,我有一个项目(作为 Fragment-Host),其中包含另一个实现(my.extension.test作为名称返回)和一个 JUnit 测试用例检查是否在返回的问候语中。该测试失败,因为 MyClient 仍然只找到实现,而不是实现。这两种实现都伴随着文件中的匹配条目。my.extensionMyWorld"World""Hello World"MyHello.getGreetings()MyDummyMyWorldMETA-INF/services/my.runtime.MyFactoryInterface

我目前使用以下代码来加载实现:

ServiceLoader<MyFactoryInterface> myFactoryLoader = ServiceLoader.load(MyFactoryInterface.class);
    for (MyFactoryInterface myFactory : myFactoryLoader) {

我知道我可以提供一个 ClassLoader 作为第二个参数ServiceLoader.load,但我不知道如何获得一个知道所有插件项目的...有什么建议吗?或者 ServiceLoader 不是解决这个问题的正确工具?

4

1 回答 1

3

如果有人偶然发现了同样的问题:ServiceLoader.load(MyFactoryInterface.class, Thread.currentThread().getContextClassLoader())inMyClientThread.currentThread().setContextClassLoader(MyWorld.class.getClassLoader());in 第二个测试的组合完成了这项工作。

于 2011-09-26T07:50:09.583 回答