这个问题与关于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依赖项加载的类?
答案 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