3

当我运行一个简单的函数来更新没有 jar 的 DOM XML 时,它运行正常。如果我将其代码放入包含许多 jar 的现有项目中,则会出现此异常

线程“主”java.lang.RuntimeException 中的异常:net.sf.saxon.trans.XPathException:无法处理 DOMSource:检查 saxon9-dom.jar 是否在类路径中

这里

  transformer.transform(source, result);

在哪里

  TransformerFactory transformerFactory = TransformerFactory.newInstance();
  Transformer transformer = transformerFactory.newTransformer();
  DOMSource source = new DOMSource(docBuilder.parse(filepath));

如何在不引入对这个 jar 的依赖的情况下解决这个问题?谢谢。

4

3 回答 3

3

此消息来自较旧版本的 Saxon,您可以按照建议将 saxon9-dom 放在类路径中,或者将 Saxon jar 文件替换为更新的版本来解决它。

一般来说,我建议不要使用 JAXP TransformerFactory 机制来加载 XSLT 处理器。您需要决定要使用哪个 XSLT 处理器,用它测试您的应用程序,然后确保在生产环境中加载该处理器,而不管类路径中可能存在什么。如果您希望您的应用程序与多个 XSLT 处理器一起工作,那么您可以实现这一点,但它应该以受控的方式完成。

于 2013-03-15T20:56:23.473 回答
2

从 API doc for 中TransformerFactory.html#newInstance(),我们可以看到有几种方法可以实现这一点。

  1. 如果您有任何其他转换器实现,例如xalan,请将其 JAR 移动到类路径的开头。
  2. 添加 JVM 选项:-Djavax.xml.transform.TransformerFactory=<any transformer class you need>.
  3. 在 JRE 目录的属性文件“lib/jaxp.properties”中指定属性。
  4. 制作一个只有一个文件的假 JAR,META-INF\services\javax.xml.transform.TransformerFactory这个文件只包含 JDK 的默认转换器工厂:com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl. 然后将其添加到类路径的开头。
于 2013-03-15T17:57:03.340 回答
1

获取 net.sf.saxon.event.Sender 的源(异常来自哪里)并查看导致错误的行:

    if (source instanceof DOMSource) {
        throw new XPathException("DOMSource cannot be processed: check that saxon9-dom.jar is on the classpath");
    }

惊人的。

我们停止使用 net.sf.saxon.TransformerFactoryImpl,然后开始使用 org.apache.xalan.processor.TransformerFactoryImpl。在那之后一切都很好。

于 2014-07-22T02:27:34.020 回答