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

在Java项目中引用外部模块的最佳实践,java,module,project,Java,Module,Project,我有一个Java项目,它期望外部模块注册到它。这些模块: 在主项目中实现特定接口 打包到uni jar中(以及任何依赖项) 包含一些人类可读的元信息(如模块名称) 我的主要项目需要能够在运行时加载(例如,使用自己的类加载器)这些外部模块中的任何一个。我的问题是:在主项目中注册这些模块的最佳方式是什么(我更喜欢使用普通Java,而不使用任何第三方框架/库来解决这个孤立的问题) 我目前的解决方案是在主项目中保留一个.properties文件,其中key=name,value=class | de

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

  • 在主项目中实现特定接口
  • 打包到uni jar中(以及任何依赖项)
  • 包含一些人类可读的元信息(如模块名称)
我的主要项目需要能够在运行时加载(例如,使用自己的类加载器)这些外部模块中的任何一个。我的问题是:在主项目中注册这些模块的最佳方式是什么(我更喜欢使用普通Java,而不使用任何第三方框架/库来解决这个孤立的问题)

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


这对我来说很重要。有更好的方法吗

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

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


此外,google for Spring OSGI及其doco在这里也会有所帮助。

Java中的标准方法是定义一个。

在@ZZ编码器上扩展

JDK内部使用的上述服务提供者模式在JDK 6中有了更正式的定义

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

当然,如果不提及EJB、Spring和OSGi的主流、更为“重量级”的标准,那将是失职的