Java 在NetBeans平台之外使用查找API

Java 在NetBeans平台之外使用查找API,java,netbeans,lookup,netbeans-platform,Java,Netbeans,Lookup,Netbeans Platform,我试图评估我们的商店在不使用整个NetBeans平台的情况下使用NetBeans查找API是否合适 到目前为止,我成功地用以下代码创建了一个项目: for (SomeInterface si : Lookup.getDefault().lookupAll(SomeInterface.class)) { si.doSomething(); } 我还创建了两个其他项目,每个项目都有一个实现SomeInterface的AnImplementation类,以及附带的文件META-INF/

我试图评估我们的商店在不使用整个NetBeans平台的情况下使用NetBeans查找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中,可以随意添加或删除它们,从而改变上述代码的结果

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


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

据我所知,您不必将所有模块与主项目捆绑在一起,就可以工作。您所需要的只是确保在启动应用程序时模块位于类路径上,因为全局查找使用隐藏的机制。根据你的问题,我建议考虑

直接使用ServiceLoader更适合解决您的问题 像这样的DI框架值得一试 如果OSGI也为您提供了一些有用的东西,请使用它。
不要误解我的意思,我绝对喜欢NetBeans和NetBeans平台,但在我看来,仅使用查找功能是有限的,因为上面列出了各种可能性。

您必须在调用应用程序中引用子项目,因为这会将它放在类路径上——如果jar/库不在类路径上,那么像Lookup和ServiceLoader这样的API将无法找到它

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

在他的博客中,他还引用了与ServiceLoader和Lookup API形成对比的内容,其中使用了NetBeans平台之外的Lookup API

编辑

我刚刚看到了一个问题的答案。
您可以使用-Djava.ext.dirs=lib属性设置一个文件夹(在本例中为“libs”)作为它必须为类路径查找JAR的位置。

感谢您的反馈。我们也将考虑Service EOLADER,但它对JDK6的限制可能不符合我们的要求。将使用DI框架,但如果我理解得很好,它需要知道哪些类在开发/打包时可用。我在这里尝试测试的用例是一个应用程序,当某个模块jar存在或不存在时,该应用程序可以同样工作,并进行自我调整。查找在serviceLoader之前就已经存在,因此您可以在java 1.4上使用它。@Tim我知道,我只是认为这不是一个争论,现在甚至1.5都不推荐使用。但是你是对的,如果你为生活编写软件,你必须处理…有趣的设置。我尝试使用来进行测试。对不起…在DictionaryService/DictionaryUser项目中,我在项目根级别创建了一个lib/文件夹。由于属性>添加JAR或文件夹,我在项目类路径中添加了lib/。我在lib/中复制了GeneralDictionary.jar。但是没有检测到该服务提供商…这是相当误导的-NetBeans不允许您仅引用一个文件夹,您必须引用所有要使用的JAR。可以从命令文件执行此操作,但是有一个警告,即您不能使用java-jar启动应用程序,您的语法必须是java-cp lib/*;yourapplication.jar.com.my.example.start指向O'Conner文章的链接已断开。现在已经找到了。