在NetBeans平台之外使用Lookup API

| 我正在尝试评估我们的商店是否适合在没有整个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,从而在启动之前对其进行标识。随时证明我错了。     
已邀请:
        您必须在调用应用程序中引用该子项目,因为这会将其放在类路径中-如果jar /库不在类路径中,则诸如Lookup和ServiceLoader之类的API将无法找到它。 如果使用OSGI或NetBeans平台,则这些系统允许您在运行时更改类路径。 Geertjans博客中有一个与此相关的条目(使用NetBeans平台之外的Lookup API),在他的博客中,他还引用了John O \'Connors博客,该博客将ServiceLoader和Lookup API进行了对比。 编辑 我刚刚看到了乔恩·斯基茨(Jon Skeets)对类似问题的回答。 您可以使用ѭ1属性设置一个文件夹(在本例中为\ libs \)作为必须为您的类路径查找jar的位置。     
        以我的理解,您不必将所有模块与主项目捆绑在一起即可工作。您所需要做的只是确保启动应用程序时模块位于类路径中,因为全局“ 2”在后台使用ServiceLoader机制。根据您的问题,我建议考虑 直接使用ServiceLoader可以更好地解决您的问题,或者 像Guice这样的DI框架值得一试或 如果OSGI也为您提供有用的东西并使用它。 别误会,我绝对喜欢NetBeans和NetBeans平台,但是在我看来,由于上面列出的可能性,单独使用
Lookup
的用途有限。     

要回复问题请先登录注册