- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在开发一个大量基于 XML 的 Java 应用程序时,我最近在 Ubuntu Linux 上遇到了一个有趣的问题。
我的应用程序,使用 Java Plugin Framework ,似乎无法转换 dom4j -创建 XML 文档到 Batik's SVG 规范的实现。
在控制台上,我得知发生了错误:
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 或类路径)。
三个突出的类加载器模型是:
我不知道 JPF 类加载器使用什么委托(delegate)策略,但关键是您希望加载一个版本的 dom 库,并且每个人都可以从同一位置获取该类。这可能意味着将其从类路径中删除并作为插件加载,或者阻止 Batik 加载它,或其他方式。
关于java - 如何处理 Java 中的 LinkageErrors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/244482/
我遵循了 http://www.jacoco.org/jacoco/trunk/doc/examples/java/CoreTutorial.java 上的 CoreTutorial 示例类(clas
我正在尝试在tomcat 8.0.22上部署spring mvc项目。我使用Gradle作为项目构建者。当我尝试为项目午餐时,我有一个 error code 500 。 这就是我的项目: build.
尝试通过命令行使用数据库迁移插件 1.3.6 时出现奇怪的错误 grails --stacktrace dbm-generate-gorm-changelog changelog.groovy 错误是
我的 JSystem/Java/Eclipse 环境有一些问题。 我收到此错误,但我不明白出了什么问题: java.lang.LinkageError: loader constraint viola
我尝试从 发送带有附件的电子邮件但我收到这个错误。看不懂什么意思。 17:11:44,059 ERROR [http-nio-8080-exec-6][render_portlet_jsp:
我正在尝试将 jboss wildfly 8 配置为将 Jackson 用于 JSON。所以我加了 org.jboss.resteasy resteasy-jackson-provi
嘿嘿, friend 们,我的方法出现了异常......请帮我解决这样的错误 Exception in handleDisplayableEvent. Reason: LinkageError so
尝试运行我的 Flex 项目,但出现以下错误,请提出任何前进的建议:- 原因: java.lang.LinkageError: ClassCastException: attempting to ca
作为针对 L 预览测试现有 Android 应用程序的一部分,该应用程序崩溃并出现以下异常: 07-08 10:05:39.024: E/AndroidRuntime(2126): FATAL EXC
我正在为使用 Java servlet 的 WebSphere 6.1 开发一个应用程序。在我的 servlet 中,我定义了一个序列号 vesion ID 1L。在部署和运行我的应用程序时,我收到了
我正在开发一个大型应用程序,我刚刚在 axis 的帮助下添加了一个由 eclipse 生成的新 Web 服务。该应用程序在我的开发环境(应用程序由 jetty 托管)中运行良好,但现在我在 weblo
我确实遇到了 TestNG 和 RESTeasy 的一个非常烦人的问题。 我确实有一个类针对使用 RESTeasy 框架来公开自身的 API 类运行多个测试。 但是,如果我让测试使用 maven (m
在开发一个大量基于 XML 的 Java 应用程序时,我最近在 Ubuntu Linux 上遇到了一个有趣的问题。 我的应用程序,使用 Java Plugin Framework ,似乎无法转换 do
例如我们得到了: net.sf.jasperreports.engine.JRException: ... Caused by: net.sf.jasperreports.engine.fill.JR
我正在尝试创建一个类加载器,它将加载 .zip 文件中的 .class 文件。我按照本教程( https://weblogs.java.net/blog/2008/07/25/how-load-cla
我在规划 Eclipse Kepler 时遇到问题。 日志文件显示“无法运行处理器错误”:* !SESSION 2015-07-11 17:27:36.405 --------------------
出于项目目的,我不得不坚持使用Java 1.6进行开发,我使用了异步客户端jar文件并将其合并到我的项目中以实现异步功能,并使用java 1.6开发并导出了一个JAR。这个 jar 包含在另一个在 j
我有这个错误 java.lang.LinkageError: ClassCastException: attempting to tomcat-debug-eclispe/wtpwebapps/xwi
这是我的Java环境: ~: java -version java version "11.0.1" 2018-10-16 LTS Java(TM) SE Runtime Enviro
如何防止 AntClassLoader 和 URLClassLoader 导致链接错误? 由于项目较旧,junit 和 hamcrest.core 被放入 ANT_HOME 中,我们的构建使用 inc
我是一名优秀的程序员,十分优秀!