代码之家  ›  专栏  ›  技术社区  ›  G__

Java项目中引用外部模块的最佳实践

  •  5
  • G__  · 技术社区  · 14 年前

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

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

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

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

    我觉得这很假。有更好的方法吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   ZZ Coder    14 年前

    Java中的标准方法是定义服务提供者。看,

    http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#Service%20Provider

        2
  •  0
  •   Kannan Ekanath    14 年前

    让所有模块通过一个标准的XML文件来表示它们的元数据。称之为“我的模块数据.xml”。

    在您的主容器启动时,它会查找一个类路径*:my module data.xml(它可以有一个frontcontroller类),并委托给各个modules frontcontroller类来执行它想要的任何操作:)

    此外,Google for Spring OSGi及其Doco在这里也很有用。

        3
  •  0
  •   Will Hartung    14 年前

    正在扩展@zz coder…

    在JDK中提到并在内部使用的服务提供者模式现在在JDK 6中有了一点形式化。 ServiceLoader . 这一概念由 Netbeans Lookup API .

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

    当然,不提到EJB、Spring和OSGi中占主导地位的、更“重量级”的标准是不明智的。