Http java.lang.LinkageError:加载程序约束冲突:加载程序

Http java.lang.LinkageError:加载程序约束冲突:加载程序,http,osgi,Http,Osgi,在这里,我在使用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/ht

在这里,我在使用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包,所以我添加了所有必需的依赖文件

有人能帮我解决这个问题吗?

Java语言基于一个名称空间。也就是说,该语言是围绕类名只使用一次的概念构建的。类加载器设计用于通过internet加载代码,但意外地允许两个类加载器使用相同的类名

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

在这样的类装入器网格中,您可以从引用从其他类装入器装入的类X和类Y的包中装入类C。因为他们有不同的名字,这没关系。然而,X可以表示类Z,Y可以表示Z,它们可以来自不同的装载机。因此,包A中的原始类C可以从两个不同的类装入器中看到Z。这是一个链接错误

当所有包都正确时,这个类加载器网格工作得很好,如果不破解包,就永远不会出现这种错误。这些错误不可避免地是由不遵循OSGi规则并手工维护捆绑包清单的复杂设置引起的

在本例中,可以多次看到的类名是
org.apache.http.client.methods.HttpPost
。因此,您有一个设置,其中有多个bundle导出这个类,这是第一个要查看的地方。因为您可以启动捆绑包,所以元数据是错误的。OSGi有特殊的元数据,在启动捆绑包之前检测到此错误,所谓的使用约束

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