我在 NetBeans 模块应用程序中使用 java ServiceLoader 时遇到了麻烦。这是我正在尝试做的事情(它适用于 Eclipse 中的普通 java 应用程序):
我有一个 interface.jar,它声明了接口。我有 implementations.jar,它有这个接口的几个实现,都在 spi/META-INF/services/my.package.name.MyInteface 文件中指定(这个文件在implementations.jar 中)。
我还有一个类 ImplementationHandler(在另一个 handler.jar 中),它具有以下方法来加载所有实现:
private static List<MyInterface<?>> loadAllImplementations() {
List<MyInterface<?>> foundImplementations = Lists.newArrayList();
try {
for (MyInterface implementation : ServiceLoader.load(MyInterface.class)) {
foundImplementations.add(implementation);
}
} catch (ServiceConfigurationError error) {
system.out.println("Exception happened");
}
return foundImplementations;
}
此代码返回 Eclipse 普通应用程序中的所有实现(foundImplementations.size() > 0)。
但是在 NetBeans 下,它找不到任何东西(foundImplementations.size() == 0)。
更多细节:
我有一个 NetBeans 模块应用程序的源代码(开源,不是我写的),我需要使用一些 MyInterface 实现来扩展它。interface.jar、implementations.jar 和 handler.jar 是在 Eclipse 中创建的,它们是另一个应用程序的一部分。
在 NetBeans 中,我打开了需要使用新实现的模块,并将所有 3 个 jars 添加为外部库(NetBeans 将它们复制到它的 ext 文件夹中,我不想要,但我无能为力 - 我希望它们在另一个 myext 文件夹中,但那是另一回事)。然后我重建了所有东西并尝试使用我的一个实现,但没有找到......获取实现的代码在 ImplementationHandler 类中,如下所示:
public static final <T> MyInteface<T> getByName(String name) {
for (MyInteface implementation : loadAllImplementations()) {
if (implementation.getName().equals(name)) {
return implementation;
}
}
throw new IllegalArgumentException("Unable to find MyInterface class for: " + name);
}
我得到了我的异常“无法找到 MyInteface 类:myImplementationName”...
我对 NetBeans 的了解非常有限,我想知道我还需要做些什么才能使其正常工作吗?