【问题标题】:How to dynamically load classes and libraries from different project in runtime如何在运行时从不同项目中动态加载类和库
【发布时间】:2012-11-12 19:28:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java xml dynamic classloader dynamic-loading


    【解决方案1】:

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

    【讨论】:

    • dependent 项目在启动时不是 independent 项目的类路径的一部分,包含 Hadoop 客户端 API(第三方库)的 .jar 也不是)。您是否介意添加有关如何在嵌套的ClassLoader 中加载项目以及 META-INF/服务的外观如何的简短代码示例?除了加载一些 JDBC 驱动程序之外,我没有加载类的经验。
    • @drasto - 我链接到的 javaodoc 详细说明了如何设置 META-INF/服务,并且这个网站上有很多很多关于设置嵌套类加载器的答案,也在这里google.com/search?q=java+tutorial+urlclassloader。跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多