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

时间:2010-05-10 16:50:44

标签: java module project

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

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

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

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

这对我来说很难过。有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

此外,Google for Spring-OSGI和他们的doco在这里也很有帮助。

答案 2 :(得分:0)

扩展@ZZ Coder ......

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

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

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