我将解决方案分为两个项目:
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?代码示例将非常感激。
答案 0 :(得分:1)
您可以使用ServiceLoader实用程序执行此操作(这是加载了多少jdk服务,例如xml库和现代jdbc驱动程序库)。如果依赖项目是启动时类路径的一部分,那么你可以去(假设设置正确)。否则,您需要在嵌套的类加载器中加载依赖项目并将其传递给load(Class,ClassLoader)
方法(或在调用load(Class)
之前将类加载器设置为当前上下文类加载器)。