ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl无法强制转换为javax.xml.parsers.DocumentBuilderFactory

时间:2017-08-11 14:50:37

标签: java maven pdf latex osgi

这个问题与关于Xerces依赖地狱的许多讨论有关,但我似乎无法解决它。

我试图用Java将LaTeX代码导出为PDF。我的代码是Cytoscape 3.4的OSGI包的一部分,并使用Maven进行管理和构建。 LaTeX库是jlatexmath(1.0.6)并写入SVG和PDF我想尝试apache fop(0.95)库。

Fop依赖于整个范围的batik库,而这些库依赖于xml-apis(1.3.04)。

包含xml-apis后,我收到此错误:

java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory
        at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
        at org.scilab.forge.jlatexmath.TeXFormulaSettingsParser.<init>(TeXFormulaSettingsParser.java:74)

这是可以理解的,因为DocumentBuilderFactory的实现应该是JRE中包含的com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

当我排除xml-apis和xml-apis-ext libs时,我收到另一个错误:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>0.95</version>
    <exclusions>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis-ext</artifactId>
        </exclusion>
    </exclusions>
</dependency>


java.lang.ClassNotFoundException: org.w3c.dom.Document not found by... [115]
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

这很奇怪,因为org.w3c.dom.Document也应该只是在JRE中。

那么,我如何强制Java使用Java中包含的类而不是查找从Maven依赖项加载的类?

2 个答案:

答案 0 :(得分:1)

Your bundle needs to import the package org.w3c.dom. You must import all packages that your bundle depends on, with the solitary exception of packages starting with java., e.g. java.lang, java.net etc.

答案 1 :(得分:0)

我设法解决了这个问题,感谢Neil Bartlett的建议org.w3c.dom没有导入(虽然我仍然不确定为什么“导入*”不够)。

在maven-bundle-plugin的配置说明中,我将导入更改为:

<Import-Package>org.w3c.dom,*;resolution:=optional</Import-Package>

此外,不应排除xml-apis-ext,因此fop依赖关系变为:

<dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>fop</artifactId>
            <version>0.95</version>
            <exclusions>
                <exclusion>
                    <groupId>xml-apis</groupId>
                    <artifactId>xml-apis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

然后,为了完成,fop工件似乎需要avalon-framework-impl中的一个类,它在maven依赖项中没有任何一个,所以我单独添加它,同时排除所有包含{{1 }}:

xml-apis