【问题标题】:Use of Lookup API outside of NetBeans Platform在 NetBeans 平台之外使用 Lookup API
【发布时间】:2014-04-09 22:26:11
【问题描述】:

我正在尝试评估我们的商店是否适合在不使用整个 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,从而在启动之前识别它们。随时证明我错了。

【问题讨论】:

    标签: java netbeans lookup netbeans-platform


    【解决方案1】:

    您必须在调用应用程序中引用子项目,因为这会将其放在类路径中 - 如果 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 的位置。

    【讨论】:

    • 我尝试使用John O'Connors blog 进行测试。
    • (sorry) ...在 DictionaryService/DictionaryUser 项目中,我创建了一个 lib/ 文件夹(在项目根级别)。由于 Properties>Add a JAR or a folder,我在项目类路径中添加了 lib/。我在 lib/ 中复制了 GeneralDictionary.jar。但是没有检测到这个服务商...
    • 这是相当误导 - NetBeans 不允许您仅引用一个文件夹,您必须引用所有要使用的 jar。可以从命令文件执行此操作,但需要注意的是,您不能使用 java -jar 启动应用程序,您的语法必须是 java -cp lib/*;yourapplication.jar com.my.example。启动应用程序
    • O'Conner 文章的链接已损坏。它现在位于here
    【解决方案2】:

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

    • 直接使用 ServiceLoader 更适合您的问题或
    • Guice 这样的 DI 框架值得一试或
    • 如果 OSGI 也提供了对您有用的东西并使用它。

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

    【讨论】:

    • 感谢您的反馈。我们也会考虑 ServiceLoader,但它对 JDK6 的限制可能不符合我们的要求。将使用 DI 框架,但如果我理解得很好,它需要知道在开发/打包时哪些类可用。我在这里尝试测试的用例是一个应用程序,无论是否存在某些“模块”jar,它都能正常工作,并且可以自行调整。
    • Lookup 存在于 serviceLoader 之前,因此您可以在 java 1.4 上使用它。
    • @Tim 我知道,我只是认为这不是一个争论,即使 1.5 也已被弃用。但你是对的,如果你为生活编写软件,你必须处理......有趣的设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多