如何处理Java中的链接错误?

2023-12-04

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

我的应用程序,使用Java插件框架,似乎无法转换dom4j- 创建 XML 文档Batik'sSVG 规范的实现。

在控制台上,我得知发生了错误:



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 <bootloader>) for interface org/w3c/dom/Document have different Class objects for the type org/w3c/dom/Attr used in the signature
    at org.apache.batik.dom.svg.SVGDOMImplementation.createDocument(SVGDOMImplementation.java:149)
    at org.dom4j.io.DOMWriter.createDomDocument(DOMWriter.java:361)
    at org.dom4j.io.DOMWriter.write(DOMWriter.java:138)
  

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

据我所知,不可能指定框架使用的类加载器。也许可以破解它,但我更喜欢采用不太激进的方法来解决这个问题,因为(无论出于何种原因)它只发生在 Linux 系统上。

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


LinkageError 是一种经典情况,其中您有一个由多个类加载器加载的类 C,并且这些类在同一代码中一起使用(比较、强制转换等),您会遇到这种情况。如果它是相同的类名,或者即使它是从相同的 jar 加载的,也没关系 - 如果从另一个类加载器加载,来自一个类加载器的类始终被视为不同的类。

该消息(多年来已经有了很大改进)说:

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 加载它,或者其他什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理Java中的链接错误? 的相关文章

随机推荐

  • 计算 Git 分支上的提交次数

    我已经找到了这个答案 git 中分支的提交数量但这假设分支是从 master 创建的 如何计算分支上的提交数量without依赖于这个假设 在 SVN 中这是微不足道的 但由于某种原因在 git 中确实很难弄清楚 要计算您所在分支的提交 g
  • 为文本着色

    如何使用 Bash 显示彩色文本 a 棕色背景上的白色文本 b 黄底黑字 echo e bbb aaa bbb and echo e aaa bbb aaa 我的结果不太好 text black e 0 30m white e 0 37m
  • Stripe webhooks 事件顺序

    我目前正在构建一个使用 Stripe 进行支付的节点应用程序 我已经设置了 webhooks 并正在工作 因为我想在我的应用程序中创建订阅者 但需要来自 stripe webhooks 的响应来存储我的 mongo 数据库中不同集合中不同事
  • 在运行时替换包中的图像

    我可以在运行时替换包中的图像吗 基本上 我的捆绑包中有一些图像 如果图像有任何更改 我也会从服务器获取它们 我可以在运行时将它们放入包中 这样我就不需要更改代码来选择图像吗 您无法更改应用程序包的内容 但是 可以将图像存储在应用程序的文档文
  • 非线性代数方程的初步猜测

    我有一个非线性代数方程组需要求解 如何使用计算值 具有连续时间变化 作为解变量的初始猜测 而不是使用参数作为起始值 初始方程部分可以用于此目的吗 我创建了一个测试模型来解释这个问题 model Teststartvalue Real val
  • R安装包tabplot

    当我安装 R 包 tabplot 时 出现了以下消息 我的 R 版本已更新为 4 0 4 因为 4 0 2 有相同的错误 错误信息如下 install packages 中的警告 包 tabplot 不适用于此版本的 R 适用于您的 R 版
  • Swift/AppleScript:无法从 Swift 代码运行 Apple 脚本

    我尝试从 Swift 代码运行 AppleScript 命令 如下所示 var appleScriptCmd tell application System Events to make login item at end with pro
  • TimerTask、定时器、线程?

    我试图在 JLabel 上连续显示日期和时间 因此 在我观看的上一篇教程中 演讲者说 您必须在必要时使用此线程 因为它会占用程序中的内存 因此 我搜索其他替代方案 发现 Timer 和 TimerTask 哪个是程序长期运行最有效的方法 定
  • 如何在 Spring Roo 中使用 de 关系内的属性建立多对多关系?

    我一直在研究这个话题 但还没有找到任何答案 我使用 spring roo 我想知道是否有一种方法可以与此关系中的属性建立多对多关系 例如 我有两个表 员工 和 医疗设备 员工可以保留许多设备 并且设备可以由许多员工保留 但是我想存储此保留发
  • 禁止目录内容,但允许 robots.txt 中的目录页面

    这是否适用于禁止目录下的页面 但仍允许该目录 url 上的页面 Allow special offers Disallow special offers 允许 www mysite com special offers 但阻止 www my
  • DC.js - 取消选择功能或过滤除单击的功能之外的所有功能

    我不确定这是否可能 并且对此进行研究没有运气 我正在使用 DC js 图表和 crossfilter js 开发仪表板 我将使用行图作为示例 是否可以做相反的事情 而不是点击要过滤的项目 例如 当我单击行图中的某个项目时 它将取消选择该项目
  • Fedora bash 程序无法正常工作

    我正在尝试运行一个简单的 bash 命令 但我不确定我错过了什么 bin bash person Craig Baiey echo person echo person echo person 每次我运行它时都会出现错误 第 2 行 未找到
  • 如何子类化UITableView?

    老实说 我不知道如何子类化 UITableView 我非常困惑 正在寻找我能得到的任何帮助 如何对 UITableView 进行 子类化 我需要这样做的原因是因为我需要表格响应背景上的触摸 以便隐藏键盘 我尝试过谷歌搜索但找不到任何东西 非
  • 从两个不同的数据框中查找唯一的列值

    如何从 DF1 和 DF2 中查找第一列的唯一值 DF1 67 Hij 14 Xyz 87 Pqr DF2 43 Def 67 Lmn 14 Xyz Output 87 Pqr 43 Def 这就是阅读方式 import pandas as
  • 检查文件是否从另一个进程打开

    如何检查 Powerscript 中的文件是否已被另一个进程使用 我发现的最好方法是调用 WinAPI CreateFile 以独占模式打开给定文件 首先 声明以下本地外部函数 PB10 FUNCTION Long CreateFile r
  • .NET 中的性能分析

    我写了一个类 它使用Stopwatch分析方法和for foreach循环 和for and foreach循环它针对一个标准循环进行测试Parallel For or Parallel ForEach执行 您可以像这样编写性能测试 Met
  • 有没有办法通过 REST API 检索 Office365 OneDrive 已删除项目(文件/文件夹)的元?

    我正在寻找一种方法来检索已删除项目 文件 文件夹 的元 我能够获取更改日志 表明已对某个项目执行了特定操作 并且如果该项目尚未被删除 我也能够检索该项目本身 当该项目被删除时就会出现问题 在这种情况下 我只知道该项目的 ID 当我查询该项目
  • 使用“grep -f”列出不匹配的条目

    以下命令给出了匹配表达式的列表 grep f tmp list Filename gt tmp output The list然后解析文件并用于搜索Filename 对于解析后的字符串 然后将结果保存到output 我将如何输出解析后的字符
  • Pandas excel导入更改日期格式

    我正在学习 python 3 6 with anaconda 以进行学习 我使用 pandas 导入一个包含 2 列的 xls 文件 日期 dd mm yyyy 和价格 但 pandas 改变了日期格式 xls file pd read e
  • 如何处理Java中的链接错误?

    在开发一个高度基于 XML 的 Java 应用程序时 我最近在 Ubuntu Linux 上遇到了一个有趣的问题 我的应用程序 使用Java插件框架 似乎无法转换dom4j 创建 XML 文档Batik sSVG 规范的实现 在控制台上 我