【问题标题】:Best Practice For Referencing an External Module In a Java Project在 Java 项目中引用外部模块的最佳实践
【发布时间】:2010-05-10 16:50:43
【问题描述】:

我有一个希望注册外部模块的 Java 项目。这些模块:

  • 在主项目中实现特定接口
  • 打包成一个 uni-jar(连同任何依赖项)
  • 包含一些人类可读的元信息(如模块名称)。

我的主项目需要能够在运行时加载(例如,使用它自己的类加载器)任何这些外部模块。我的问题是:将这些模块注册到主项目的最佳方式是什么(我更愿意保留这个 vanilla Java,而不是使用任何第三方框架/库来解决这个孤立的问题)?

我目前的解决方案是在主项目中保留一个 .properties 文件,其中 key=name, value=class |delimiter|人类可读的名称(或协调两个 .properties 文件以避免分隔符解析)。在运行时,主项目加载到 .properties 文件中,并使用它找到的任何条目来驱动类加载器。

这对我来说很奇怪。有更好的方法吗?

【问题讨论】:

    标签: java module project


    【解决方案1】:

    Java 中的标准方法是定义Service Provider

    【讨论】:

      【解决方案2】:

      让所有模块通过一个标准的 xml 文件来表达它们的元数据。称之为“my-module-data.xml”。

      在你的主容器启动时,它会寻找一个类路径*:my-module-data.xml"(它可以有一个 FrontController 类)并委托给各个模块 FrontController 类来做它想做的任何事情:)

      还有 google for Spring-OSGI 和他们的文档可以在这里提供帮助。

      【讨论】:

        【解决方案3】:

        扩展 @ZZ Coder...

        在 JDK 6 中提到并在 JDK 内部使用的服务提供者模式现在更加正式,ServiceLoaderNetbeans Lookup API 进一步扩展了这个概念。

        底层基础设施是相同的。也就是说,两个 API 都使用相同的工件,以相同的方式。 NetBeans 版本只是一种更灵活、更健壮的 API(例如,允许替代查找服务以及默认服务)。

        当然,如果不提及 EJB、Spring 和 OSGi 占主导地位的、更“重量级”的标准,那将是一种疏忽。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-24
          • 2010-10-04
          • 2018-05-10
          • 2011-02-20
          • 2022-08-09
          • 2012-05-28
          • 1970-01-01
          相关资源
          最近更新 更多