Page 1 of 1

BundleClassLoader issue with Docx4j

PostPosted: Sun Apr 11, 2021 6:22 pm
by amikmr
Am using org.docx4j.Docx4J in a desktop application (JDK1.8) for converting WORD file to PDF and it all works fine.

The same desktop application, when launched as an OSGi plug-in (JDK1.8), throws NoClassDefFoundError: javax/xml/bind/JAXBException for the above mentioned conversion.

Upon adding the below dependencies:

Code: Select all
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'


I get this error:

    java.lang.linkageerror: loader constraint violation: when resolving interface method "javax.xml.stream.XMLStreamReader.getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;"
    the class loader "" (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 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)

When i add just these three to my plug-in bundle:

Code: Select all
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'


i have:

    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)

I really hope someone kindly help me out. All of this has to do with bundle class loading!

Original issue: https://stackoverflow.com/questions/669 ... der-docx4j

Re: BundleClassLoader issue with Docx4j

PostPosted: Mon Apr 12, 2021 8:29 am
by jason
Why would you add all 3 docx4j-JAXB-* when the instructions at https://www.docx4java.org/downloads.html say clearly to add one and only one?

Have you seen https://github.com/plutext/docx4j/blob/master/OSGi.md That's about as far as we've got with OSGi...

Re: BundleClassLoader issue with Docx4j

PostPosted: Mon May 24, 2021 7:56 am
by amikmr
Thanks Jason and sorry for such a late response.

I now have the below Null Pointer Exception...

Code: Select all
org.docx4j.openpackaging.exceptions.Docx4JException: Couldn't load xml from stream
   at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:641)
   at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:418)
   at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:287)
   at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:265)
   at org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(WordprocessingMLPackage.java:168)
   ... 11 more
Caused by: java.lang.NullPointerException: Cannot invoke "javax.xml.bind.JAXBContext.createUnmarshaller()" because "jc" is null
   at org.docx4j.convert.in.FlatOpcXmlImporter.<init>(FlatOpcXmlImporter.java:111)
   at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:638)


...when running the Java application as an OSGi bundle. The same, when run standalone runs perfectly with below sample log-notes:

Code: Select all
INFO org.docx4j.openpackaging.packages.OpcPackage - Assuming Flat OPC XML
INFO org.docx4j.jaxb.Context - java.vendor=Oracle Corporation
INFO org.docx4j.jaxb.Context - java.version=11.0.1
INFO org.docx4j.jaxb.Context - java.vm.name=OpenJDK 64-Bit Server VM
DEBUG org.docx4j.jaxb.Context - JAXB Context: com.sun.xml.bind.v2.runtime.JAXBContextImpl
INFO org.docx4j.jaxb.Context - JAXB Reference Implementation is in use.
DEBUG org.docx4j.jaxb.Context - .. other contexts loaded ..
DEBUG org.docx4j.XmlUtils - Oracle Corporation
DEBUG org.docx4j.XmlUtils - 11.0.1
DEBUG org.docx4j.utils.ResourceUtils - Attempting to load: docx4j.properties
DEBUG org.docx4j.utils.ResourceUtils - Trying Thread.currentThread().getContextClassLoader()
WARN org.docx4j.utils.ResourceUtils - Couldn't get resource: docx4j.properties
WARN org.docx4j.Docx4jProperties - Couldn't find/read docx4j.properties; docx4j.properties not found via classloader.
INFO org.docx4j.XmlUtils - setProperty com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
INFO org.docx4j.XmlUtils - actual: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
INFO org.docx4j.XmlUtils - setProperty com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
INFO org.docx4j.XmlUtils - actual: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
DEBUG org.docx4j.XmlUtils - Unwrapped org.docx4j.xmlPackage.Package
DEBUG org.docx4j.XmlUtils - name: {http://schemas.microsoft.com/office/2006/xmlPackage}package
DEBUG org.docx4j.convert.in.FlatOpcXmlImporter - Adding /_rels/.rels


Below i list all of my libraries used:

    activation-1.1.1.jar
    antlr-2.7.7.jar
    antlr-runtime-3.5.2.jar
    avalon-framework-api-4.3.1.jar
    avalon-framework-impl-4.3.1.jar
    batik-awt-util-1.11.jar
    batik-bridge-1.11.jar
    batik-constants-1.11.jar
    batik-css-1.11.jar
    batik-ext-1.11.jar
    batik-extension-1.11.jar
    batik-gvt-1.11.jar
    batik-svg-dom-1.11.jar
    batik-svggen-1.11.jar
    batik-transcoder-1.11.jar
    batik-util-1.11.jar
    c3p0-0.9.1.2.jar
    checker-qual-2.8.1.jar
    commons-beanutils-1.9.3.jar
    commons-cli-1.4.jar
    commons-codec-1.12.jar
    commons-collections-3.2.2.jar
    commons-compress-1.18.jar
    commons-configuration2-2.5.jar
    commons-csv-1.7.jar
    commons-io-2.6.jar
    commons-lang3-3.9.jar
    commons-logging-1.2.jar
    commons-net-2.2.jar
    commons-text-1.7.jar
    documents4j-server-standalone-1.1.1-shaded.jar
    docx4j-core-11.2.9.jar
    docx4j-export-fo-11.2.9.jar
    docx4j-JAXB-ReferenceImpl-11.2.9.jar
    docx4j-openxml-objects-11.2.9.jar
    docx4j-openxml-objects-pml-11.2.9.jar
    docx4j-openxml-objects-sml-11.2.9.jar
    dom4j-1.6.1.jar
    error_prone_annotations-2.3.3.jar
    FastInfoset-1.2.16.jar
    fontbox-2.0.16.jar
    fop-2.3.jar
    guava-26.0-jre.jar
    hibernate-core-3.3.1.GA.jar
    httpclient-4.5.9.jar
    httpcore-4.4.11.jar
    httpmime-4.5.9.jar
    istack-commons-runtime-3.0.8.jar
    jackson-annotations-2.9.0.jar
    jackson-core-2.9.9.jar
    jackson-databind-2.9.9.jar
    jakarta.activation-api-1.2.1.jar
    jakarta.xml.bind-api-2.3.2.jar
    javassist-3.25.0-GA.jar
    javax.mail-1.6.2.jar
    jaxb-runtime-2.3.2.jar
    jaxb-svg11-1.0.2.jar
    jaxb-xslfo-1.0.1.jar
    jcl-over-slf4j-1.7.26.jar
    jdom-1.1.3.jar
    jline-2.14.2.jar
    jta-1.1.jar
    jython-standalone-2.7.1.jar
    log4j-api-2.12.0.jar
    log4j-core-2.12.0.jar
    log4j-slf4j-impl-2.12.0.jar
    mbassador-1.3.2.jar
    org.apache.felix.scr-2.0.12.jar
    sardine-5.9.jar
    slf4j-api-1.8.0-beta4.jar
    stax-ex-1.8.1.jar
    stringtemplate-3.2.1.jar
    txw2-2.3.2.jar
    wmf2svg-0.9.8.jar
    xalan-interpretive-11.0.0.jar
    xalan-serializer-11.0.0.jar
    xmlgraphics-commons-2.3.jar
    xmlpull-1.1.3.1.jar
    xpp3_min-1.1.4c.jar
    xstream-1.4.10.jar
    xz-1.8.jar

Re: BundleClassLoader issue with Docx4j

PostPosted: Tue May 24, 2022 1:17 pm
by jonaskinny
looks like your Context is null.

at org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(WordprocessingMLPackage.java:168)
... 11 more
Caused by: java.lang.NullPointerException: Cannot invoke "javax.xml.bind.JAXBContext.createUnmarshaller()" because "jc" is null

I suspect the "jc" is null comes from ...

public class Context {

public static final JAXBContext jc;