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

时间:2012-11-12 19:28:41

标签: java xml dynamic classloader dynamic-loading

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

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

独立的项目中,有一个类(让我们称之为类A)消耗(使用)ExampleInf声明的服务。由于独立不链接依赖项目,因此为了使用ExampleInf,它需要在运行时动态加载其实现ExampleImpl。此外,它还需要动态加载ExampleImpl所需的所有第三方库。

目前,这是由一堆常量(public static final String属性)完成的,这些常量包含依赖项目的路径,其中包含动态加载的资源以及大量凌乱的ClassLoader代码。我认为这不是一个好的解决方案。是否有任何模式,最佳实践或常见方式可以做到这一点?根据您的经验,您会推荐什么?

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

1 个答案:

答案 0 :(得分:1)

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