【问题标题】:LinkageError: loader constraint violation - BundleClassLoader - docx4jLinkageError:加载程序约束违规 - BundleClassLoader - docx4j
【发布时间】:2021-06-29 00:42:54
【问题描述】:

我在桌面应用程序 (JDK1.8) 中使用 org.docx4j.Docx4J 将 WORD 文件转换为 PDF,一切正常。

当作为 OSGi 插件 (JDK1.8) 启动时,相同的桌面应用程序会针对上述转换引发 NoClassDefFoundError: javax/xml/bind/JAXBException。

添加以下依赖项后:

implementation group: 'org.docx4j', name: 'docx4j-JAXB-Internal', version: '8.2.8'  
implementation group: 'org.docx4j', name: 'docx4j-JAXB-ReferenceImpl', version: '8.2.8'
implementation group: 'org.docx4j', name: 'docx4j-JAXB-MOXy', version: '8.2.8'

我收到以下错误(粗体):

java.lang.linkageerror:加载程序约束违规:解析接口方法“javax.xml.stream.XMLStreamReader.getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;”时 类加载器 "" (org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@2dd2e270的实例, sun.misc.Launcher$AppClassLoader@277050dc 的子级)当前类,org/eclipse/persistence/internal/oxm/record/namespaces/UnmarshalNamespaceContext, 和类加载器 方法的定义类,javax/xml/stream/XMLStreamReader, 对签名中使用的 javax/xml/namespace/NamespaceContext 类型有不同的 Class 对象

java.lang.linkageerror: loader constraint violation: when resolving interface method "javax.xml.stream.XMLStreamReader.getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;"
the class loader "<unnamed>" (instance of org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@2dd2e270,
child of sun.misc.Launcher$AppClassLoader@277050dc) of the current class, org/eclipse/persistence/internal/oxm/record/namespaces/UnmarshalNamespaceContext,
and the class loader <bootstrap> for the method's defining class, javax/xml/stream/XMLStreamReader,
have different Class objects for the type javax/xml/namespace/NamespaceContext used in the signature
at org.eclipse.persistence.internal.oxm.record.namespaces.UnmarshalNamespaceContext.getPrefix(UnmarshalNamespaceContext.java:58)
at org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl.resolveNamespaceUri(UnmarshalRecordImpl.java:1338)
at org.eclipse.persistence.internal.oxm.SAXFragmentBuilder.startElement(SAXFragmentBuilder.java:78)
at org.eclipse.persistence.internal.oxm.XMLRelationshipMappingNodeValue.setupHandlerForKeepAsElementPolicy(XMLRelationshipMappingNodeValue.java:231)
at org.eclipse.persistence.internal.oxm.XMLAnyObjectMappingNodeValue.startElement(XMLAnyObjectMappingNodeValue.java:179)
at org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl.startElement(UnmarshalRecordImpl.java:864)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parseEvent(XMLStreamReaderReader.java:138)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:102)
at org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader.parse(XMLStreamReaderReader.java:89)
at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:940)
at org.eclipse.persistence.internal.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:655)
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:637)  
at org.docx4j.convert.in.FlatOpcXmlImporter.<init>(FlatOpcXmlImporter.java:132)

根据建议,当我将这三个添加到我的插件包中时:

implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'
implementation group: 'org.docx4j', name: 'docx4j-JAXB-ReferenceImpl', version: '8.2.8'
implementation group: 'javax.xml.stream', name: 'stax-api', version: '1.0-2'

我有:

ClassCastException: com.ctc.wstx.stax.WstxInputFactory (loaded by sun.misc.Launcher$AppClassLoader@0x0000000100046e00) cannot be cast to javax.xml.stream.XMLInputFactory
(loaded by org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100240038)
(found matching super class javax.xml.stream.XMLInputFactory loaded by , but needed loader org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100240038)
at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
at org.docx4j.convert.in.FlatOpcXmlImporter.<init>(FlatOpcXmlImporter.java:115)

我真的希望来自 DOCX4J 和/或 APACHE FELIX 的人能帮助我。所有这些都与捆绑类加载有关!

【问题讨论】:

    标签: apache-felix docx4j


    【解决方案1】:

    您需要为 JAXB-API 添加一个依赖项,因为它不再是现代 JRE 的一部分:

    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.1'

    此外,您需要添加您添加的三个依赖项中的一个(并且仅一个)。由于删除了 JAXB,第一个可能不起作用,所以我会选择第二个:

    implementation group: 'org.docx4j', name: 'docx4j-JAXB-ReferenceImpl', version: '8.2.8'

    删除您添加的另外两个依赖项。

    【讨论】:

    • 感谢格式化我的问题。但是,当我只添加这两个时:实现组:'javax.xml.bind',名称:'jaxb-api',版本:'2.3.1' & 实现组:'org.docx4j',名称:'docx4j-JAXB -ReferenceImpl',版本:'8.2.8' 到我的插件包,我得到基本错误:java.lang.NoClassDefFoundError: javax/xml/stream/XMLStreamException at org.docx4j.openpackaging.packages.OpcPackage.load( OpcPackage.java:638) 在 org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:418) 在 org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:287)
    • 您可以添加此依赖项以了解有关异常的更多信息:实现组:'javax.xml.stream',名称:'stax-api',版本:'1.0-2'
    • 我有: ClassCastException: com.ctc.wstx.stax.WstxInputFactory (由 sun.misc.Launcher$AppClassLoader@0x0000000100046e00 加载)不能转换为 javax.xml.stream.XMLInputFactory (加载通过 org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100240038)
    • (找到匹配的超类 javax.xml.stream.XMLInputFactory 加载,但需要加载器 org.apache.felix.framework.BundleWiringImpl$BundleClassLoader@0x0000000100240038)在 javax.xml.stream.XMLInputFactory.newInstance (XMLInputFactory.java:136) 在 org.docx4j.convert.in.FlatOpcXmlImporter.(FlatOpcXmlImporter.java:115)
    • 老实说,我已经尝试了所有这些方法,并且真的希望来自 DOCX4J 和/或 APACHE FELIX 的人能帮助我。所有这些都与捆绑类加载有关!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2018-01-14
    • 2013-08-18
    • 2011-04-15
    相关资源
    最近更新 更多