在NetBeans平台之外使用Lookup API

时间:2011-05-30 21:35:18

标签: 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”) .AnImplementation“)。

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

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

如果我没弄错的话,这就是Lookup API文档中公布的行为。 提前谢谢。

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

2 个答案:

答案 0 :(得分:4)

你必须在你的调用应用程序中引用子项目,因为它将它放在类路径上 - 如果jar / library不在类路径上,那么像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的位置。

答案 1 :(得分:1)

根据我的理解,您不必将所有模块与主项目捆绑在一起,以实现此目的。您只需要在启动应用程序时确保模块位于类路径中,因为全局Lookup使用了ServiceLoader机制。根据您的问题,我建议考虑是否

  • 直接使用ServiceLoader可以更好地匹配您的问题或
  • Guice这样的DI框架值得一试或
  • 如果OSGI也为您提供了一些有用的东西并使用它。

不要误解我的意思,我非常喜欢NetBeans和NetBeans平台,但在我看来,由于上面列出的可能性,单独使用Lookup的用途有限。