如何在运行时动态加载来自不同项目的类和库

最后发布: 2012-11-12 19:28:41


问题

我将解决方案分为2个项目:

  • 独立项目包含接口ExampleInf并声明该应用程序所需的一些服务。 这些服务由第三方API( Hadoop客户端API)提供。 该项目包含GUI组件和其他应用程序逻辑,但不链接提供ExampleInf声明的服务的第三方库。 该项目中没有实现ExampleInf类。
  • 包含到第三方库的链接的从属项目。 该项目包含类ExampleImpl ,该类封装了第三方API并实现了ExampleInf

独立项目中,存在使用(使用) ExampleInf声明的服务的类(我们称其为A类)。 因为独立程序不链接从属项目,所以为了使用ExampleInf它需要在运行时动态加载其实现ExampleImpl 它还需要动态加载ExampleImpl所需的所有第三方库。

当前,这是通过一堆常量( public static final String属性)完成的,这些常量包含指向动态加载资源所在的依赖项目的路径以及许多混乱的ClassLoader代码。 我认为这不是一个好的解决方案。 是否有任何模式,最佳实践或通用方法可以做到这一点? 您会根据自己的经验推荐什么?

这种模式让我想起了Java EE中的依赖注入。 至少我认为,最好将需要动态加载到XML的类和库(.jar-s)的位置外部化,然后将它们全部循环加载,而不是为每个常量单独调用ClassLoader.loadClass 有什么不错的干净方法如何在同一包中加载XML并加载该XML指定的类和jar? 代码示例将不胜感激。

java xml dynamic classloader dynamic-loading
回答

您可以使用ServiceLoader实用程序执行此操作(这是加载了许多jdk服务,例如xml库和现代的jdbc驱动程序库)。 如果从属项目在启动时是类路径的一部分,那么您可以继续进行(假设它已正确设置)。 否则,您将需要在嵌套的类加载器中加载相关项目,并将其传递给load(Class,ClassLoader)方法(或在调用load(Class)之前将类加载器设置为当前上下文类加载器)。