这似乎是Schematron任务中的一个错误. Ant任务加载Saxon XSLT处理器的方式要求Saxon在系统类路径上,即使任务本身位于子类加载器上也是如此.
private TransformerFactory _factory = TransformerFactoryImpl.newInstance();
(其中TransformerFactoryImpl是Saxon的TransformerFactory实现),但实际上TransformerFactoryImpl没有定义自己的newInstance()方法,因此这是TransformerFactory的继承newInstance,它将根据javax的值查找合适的工厂. xml.transform.TransformerFactory系统属性. Ant任务does set this system property:
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
但是TransformerFactory.newInstance()将在系统类加载器上查找此类,而不必在加载schematron任务的类加载器上查找.
修复方法是将ValidatorFactory第120行简单地更改为
private TransformerFactory _factory = new TransformerFactoryImpl();
这将绕过所有动态查找并直接实例化正确的类.有了这个修复就位
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar:lib/saxon9he.jar"/>
会正常工作.
我建议你向开发人员报告这个bug,但是项目看起来并不特别活跃,所以你可能只需构建自己的本地fork而不是……