【问题标题】:java.lang.LinkageError: loader constraint violation: loaderjava.lang.LinkageError:加载程序约束冲突:加载程序
【发布时间】:2020-07-17 14:59:03
【问题描述】:

使用 HttpPost 连接时出现以下错误,

Caused by: java.lang.LinkageError: loader constraint violation: loader
 (instance of org/jboss/osgi/framework/internal/HostBundleClassLoader) 
 previously initiated loading for a different type with name
 "org/apache/http/client/methods/HttpPost"

我正在使用 OSGI 包,所以我添加了所有必需的依赖文件。

那么谁能帮我解决这个问题?

【问题讨论】:

    标签: http osgi


    【解决方案1】:

    Java 语言基于单一命名空间。也就是说,该语言是围绕类名仅一次使用的概念构建的。类加载器旨在通过 Internet 加载代码,但意外允许 2 个类加载器使用相同的类名

    在 OSGi 中,每个包都有一个类加载器,它直接从其自己的包中加载类,但对任何 导入的包使用其他包的类加载器/em> 类。

    在这样一个类加载器的网格中,您会遇到这样的情况,即您可以从引用类 X 和从其他类加载器加载的类 Y 的 Bundle 加载类 C。因为他们有不同的名字,没关系。但是,X 可以引用 Z 类,Y 可以引用 Z,它们可能来自不同的加载器。因此,Bundle A 中的原始类 C 可以从两个不同的类加载器中看到 Z。并且是一个链接错误。

    这个类加载器的mesh在所有包都正确的情况下工作得很好,当你不hack你的包时你不应该遇到这种错误。这些错误不可避免地是由不遵循 OSGi 规则并手动维护 Bundle 清单的复杂设置引起的。

    在这种情况下,可以多次看到的类名是org.apache.http.client.methods.HttpPost。所以你有一个设置,其中有多个包导出这个类,这是第一个查看的地方。由于您可以启动捆绑包,因此元数据是错误的。 OSGi 具有特殊的元数据,可以在您启动捆绑软件之前检测到此错误,即所谓的使用约束

    在 Apache Felix 上,您可以对问题进行广泛的分析。如果您可以在 Apache Felix 上运行您的代码,那将是最简单的方法。查看您的错误,您似乎在 JBoss 上运行。他们总是对 OSGi 规则有点松懈,以使运行企业软件更容易。很少提供 OSGi 元数据的软件,并且以其类加载器黑客而闻名。 (很多人只是在 Java 模块系统开始了解 OSGi 正在做什么和需要什么之后。)

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多