【发布时间】: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