我有一个Java项目,希望在其中注册外部模块。这些模块:
我的主项目需要能够在运行时加载(例如使用自己的类加载器)任何这些外部模块。我的问题是:在主项目中注册这些模块的最佳方法是什么(我更喜欢保留这个vanilla Java,而不是使用任何第三方框架/库来处理这个孤立的问题)?
我目前的解决方案是使用key = name,value = class | delimiter |在主项目中保留单个.properties文件。人类可读的名称(或协调两个.properties文件,以避免分隔符解析)。在运行时,主项目加载到.properties文件中,并使用它找到的任何条目来驱动类加载器。
这对我来说很难过。有更好的方法吗?
答案 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的主导,更“重量级”标准,那将是一种疏忽。