当前位置: 首页 > 面试题库 >

如何处理Java中的LinkageErrors?

濮阳原
2023-03-14
问题内容

在开发一个高度基于XML的Java应用html" target="_blank">程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。

我的应用程序使用Java Plugin
Framework
,似乎无法将dom4j创建的XML文档转换为Batik的
SVG规范实现。

在控制台上,我了解到发生了错误:

线程“ AWT-EventQueue-0”中的异常java.lang.LinkageError:接口可初始化中违反了加载程序约束:解决方法“ org.apache.batik.dom.svg.SVGOMDocument.createAttribute(Ljava / lang / String;)Lorg / w3c / dom / Attr;“ 当前类org / apache / batik / dom / svg / SVGOMDocument的类加载器(org / java / plugin / standard / StandardPluginClassLoader的实例)和接口org / w3c /的类加载器(<bootloader>的实例) dom / Document在签名中使用的org / w3c / dom / Attr类型具有不同的Class对象
    在org.apache.batik.dom.svg.SVGDOMImplementation.createDocument(SVGDOMImplementation.java:149)
    在org.dom4j.io.DOMWriter.createDomDocument(DOMWriter.java:361)
    在org.dom4j.io.DOMWriter.write(DOMWriter.java:138)

我认为问题是由JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。

据我所知,不可能为框架指定一个类加载器。也许可以破解它,但是我宁愿使用一种不太积极的方法来解决此问题,因为(出于某种原因)它仅在Linux系统上发生。

你们中的一个人遇到过这样的问题,并且知道如何解决它,或者至少是问题的核心吗?


问题答案:

在经典情况下,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加载它或其他东西。



 类似资料:
  • 问题内容: 在开发高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由来自JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

  • 本文向大家介绍如何在Java中处理Selenium中的代理?,包括了如何在Java中处理Selenium中的代理?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助PROXY类在Java中使用Selenium处理代理。

  • 问题内容: 如何用Java 处理? 问题答案: 我不确定“句柄”是什么意思。 您当然可以捕获该错误: 但这很可能是个坏主意,除非您确切地知道自己在做什么。

  • 有没有办法过滤掉所有大于最大值的值,这些值可以存储在使用StreamAPI的Long中?目前的情况是,您可以在前端使用简单的搜索条搜索某些客户,通过使用他们的ID。例如:如果您在这两个ID之间放置一个“隔离器”,一切都正常。但是如果您忘记了“隔离器”,我的代码试图将解析为Long,我想这就是问题所在。这会在尝试搜索后导致一个数字格式异常。有没有办法过滤掉这些因为太大而无法解析为Long的数字? 谢

  • foo(8073)调用foo(8074) foo(8074)调用foo(8075),foo(8075) foo(8074)记录自身并调用bar(8075), foo(8074)死亡,foo(8073)捕获它,记录自己并调用bar(8074) bar(8074)调用bar(8075),bar(8074)死亡,因此bar(8074)记录自己 从所有方法返回,并优雅地关闭 我明白了,一切都很好。所以有一

  • 问题内容: 如何处理Java中的同时按键? 我正在尝试编写游戏,并且需要一次处理多个按键。 当我按住一个键(假设向前移动),然后按住另一个键(例如,向左转)时,将检测到新键,但不再检测到旧键。 问题答案: 一种方法是跟踪自己当前按下了哪些键。 当您收到keyPressed事件时,将新键添加到列表中;当您收到keyReleased事件时,请从列表中删除密钥。 然后,在游戏循环中,您可以根据按键列表中