如何处理Java中的LinkageErrors?

如何处理Java中的LinkageErrors?,第1张

如何处理Java中的LinkageErrors?

在经典情况下,linkageError是您将得到的,在经典情况下,您有一个以上的类加载器加载了一个类C,并且这些类在同一代码(比较,强制转换等)中一起使用。相同的Class名称或是否从相同的jar加载都没关系-
如果从另一个classloader加载,则一个classloader的Class始终被视为另一个Class。

消息(这些年来已大大改进)说:

Exception in thread "AWT-EventQueue-0" java.lang.linkageError: loader constraint violation in interface itable initialization: when resolving method "org.apache.batik.dom.svg.SVGOMdocument.createAttribute(Ljava/lang/String;)Lorg/w3c/dom/Attr;" the class loader (instance of org/java/plugin/standard/StandardPluginClassLoader) of the current class, org/apache/batik/dom/svg/SVGOMdocument, and the class loader (instance of ) for interface org/w3c/dom/document have different Class objects for the type org/w3c/dom/Attr used in the signature

因此,这里的问题在于解析SVGOMdocument.createAttribute()方法,该方法使用org.w3c.dom.Attr(标准DOM库的一部分)。但是,与Batik一起加载的Attr版本是从与传递给该方法的Attr实例不同的类加载器加载的。

您会看到Batik的版本似乎是从Java插件加载的。并且您的文件是从“”加载的,“”很有可能是内置的JVM加载程序之一(引导类路径,ESOM或类路径)。

三种杰出的类加载器模型是:

  • 委托(JDK中的默认值-先问父母,然后问我)
  • 授权后(常见于插件,Servlet和需要隔离的地方-问我,然后问父母)
  • 同级(在OSGi,Eclipse等依赖模型中很常见)

我不知道JPF类加载器使用什么委派策略,但是关键是要加载dom库的一个版本,并且每个人都希望从同一位置获取该类。这可能意味着将其从类路径中删除并作为插件加载,或者阻止Batik加载它或其他东西。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5163923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存