【问题标题】:How to prevent loading class from jar如何防止从jar加载类
【发布时间】:2012-07-24 20:26:24
【问题描述】:

我正在为一些应用程序编写插件。让我们假设 libA-1.0 的 Application hava 库依赖项和我的插件具有 libA-2.0 的类似依赖项。版本不同,互不兼容(即他们有不同的api方法签名)。

如何防止我的插件从 libA-1.0 加载类(或如何强制它使用来自 libA.2.0 的类)?

有什么方法可以做到这一点,而不是编写自定义类加载器,也不使用 forName、loadClassDefinition 调用?

当您将一些库放入 *.war 存档并且由于 Web 容器在类路径上有“相同”的库时,它们不会加载,也会出现类似的问题。

感谢您的帮助。

问候, 帕维尔

【问题讨论】:

  • 我很想知道在没有类加载器的情况下是否可以做到这一点,但我建议没有。

标签: java jar classpath classloader contextclassloader


【解决方案1】:

OSGI 提供开箱即用的此功能。我确信还有一些其他插件框架提供了类似的功能。

有一个URLClassLoader 应该能够提供很多从不同的jar 加载类的功能。您必须付出一些努力来更改正在执行工作的线程的类加载器。手头没有示例,如果您需要具体示例,则必须编写一个(除非您可以通过搜索引擎找到示例)

【讨论】:

  • 何时以及如何更改类加载器。假设我的插件在 MyPlugin 类中有方法 entryPoint(),并且这个方法是由我之前提到的 Application 调用的。当运行时开始执行方法 entryPoint() 时,MyPlugin 类只是通过一些类加载器。如果我将 Thread.getCurrentThread().setContextClassloader() 中的类加载器更改为我的自定义 UrlClassLoader 会起作用吗?为什么 /Wny 不是?欢迎解释:)
猜你喜欢
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多