1

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

  • 独立项目包含接口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?代码示例将不胜感激。

4

1 回答 1

1

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

于 2012-11-12T19:40:09.920 回答