java - 在 NetBeans 平台之外使用 Lookup API

标签 java netbeans lookup netbeans-platform

我正在尝试评估我们的商店在不使用整个 NetBeans 平台的情况下使用 NetBeans Lookup API 是否合适。

到目前为止,我成功地使用以下代码创建了一个项目:

 for (SomeInterface si : Lookup.getDefault().lookupAll(SomeInterface.class)) {
     si.doSomething();
 }

我还创建了几个其他项目,每个项目都有一个实现 SomeInterface 的 AnImplementation 类,以及随附的文件 META-INF/services/path.to.SomeInterface 包含引用该类的行(例如“other.path.to” .一个实现”)。

当我将这些实现项目添加到 NetBeans IDE 中主项目的库(依赖项)时,它工作正常,并且我可以看到两个实现中 doSomething() 的连续结果。

我的问题是如何在不引用主项目中的子项目的情况下使其工作;构建时,子项目的 jar 不会包含在主项目生成的 jar 中,并且可以随意添加或删除它们,从而改变上述代码的结果。

如果我没记错的话,这是 Lookup API 文档中宣传的行为。 提前致谢。

编辑:目前,我的结论是,如果没有 NetBeans 平台(或 OSGi?),就不可能检测启动时存在哪些服务提供商。您需要在类路径中引用它们的 jar,从而在启动之前识别它们。请随意证明我错了。

最佳答案

您必须在调用应用程序中引用子项目,因为这会将其放在类路径上 - 如果 jar/库不在类路径上,则 Lookup 和 ServiceLoader 等 API 将无法找到它。

如果您使用 OSGI 或 NetBeans 平台,这些系统允许您在运行时更改类路径。

Geertjans blog有一个关于这一点的条目(在 NetBeans 平台之外使用 Lookup API),在他的博客中他还引用了 John O'Connors blog它对比了 ServiceLoader 和 Lookup API

编辑

我刚刚看到Jon Skeets'回答similar question 。 您可以使用 -Djava.ext.dirs=lib 属性将文件夹(在本例中为“libs”)设置为必须在其中查找类路径的 jar 的位置。

关于java - 在 NetBeans 平台之外使用 Lookup API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6180945/

相关文章:

caching - 访问 Infinispan 缓存容器失败

c# - 多个线程从 Lookup<TKey, TElement> 中读取是否安全?

java - 从文本文件中提取数据以制作公历

linux - Linux升级后使用gcc的Netbeans无法找到标准头文件

python - 找出出现奇数次的字母

visual-studio - 如何开始单元测试?

java - 运行jar时的当前目录路径

java - 从 MainActivity 切换或删除启动屏幕

java - 如何从 Android 中的文本输入框获取用户输入?

java - 如何使用java在mongoDB中创建一对多