Java 在build.xml中设置ANT类路径
这个问题已经被问了好几次,但我并不十分满意。我并不是真的对提议的变通办法感兴趣,而是对如何做我真正想做的事感兴趣 我希望得到一个令人满意的解释,解释为什么这是不可能的,如果不是的话,因为我会建议自己提交一个修复方案,我希望了解为什么没有尝试过一些看起来如此简单的东西 目前,为了确保ant可以使用一组JAR,必须应用以下方法之一:Java 在build.xml中设置ANT类路径,java,ant,schematron,Java,Ant,Schematron,这个问题已经被问了好几次,但我并不十分满意。我并不是真的对提议的变通办法感兴趣,而是对如何做我真正想做的事感兴趣 我希望得到一个令人满意的解释,解释为什么这是不可能的,如果不是的话,因为我会建议自己提交一个修复方案,我希望了解为什么没有尝试过一些看起来如此简单的东西 目前,为了确保ant可以使用一组JAR,必须应用以下方法之一: 添加到CLASSPATH环境变量中,文档中的“不推荐” 添加到$ANT\u HOME/lib或~/.ANT/lib-需要在生成环境中进行配置 在ant调用上设置-li
- 添加到
环境变量中,文档中的“不推荐”CLASSPATH
- 添加到
或$ANT\u HOME/lib
-需要在生成环境中进行配置~/.ANT/lib
- 在
调用上设置ant
参数-lib
ant
wrapper脚本中捕获了构建)
特别是,我试图调用任务,该任务应按照如下方式设置:
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar"/>
接下来的建议是taskdef本身接受这些额外的CLASSPATH
条目,但我在schematron ant任务中尝试了这一点,但没有效果
关键问题是schematron ant任务是否应该支持这一点,或者ant build.xml是否可以在其内部配置其全局类路径
这似乎是人们经常想做的事情,由于ant文档本身建议不要使用类路径,我很惊讶build.xml本身没有其他选择 这似乎是Schematron任务中的一个bug。Ant任务加载Saxon XSLT处理器的方式要求Saxon位于系统类路径上,即使任务本身位于辅助类加载器上 乍一看似乎很明智:
private TransformerFactory _factory = TransformerFactoryImpl.newInstance();
(其中TransformerFactoryImpl
是Saxon对TransformerFactory
的实现),但实际上TransformerFactoryImpl
没有定义自己的newInstance()
方法,因此这是从TransformerFactory
继承的newInstance
,它将根据javax.xml.transform.TransformerFactory
系统属性的值查找适当的工厂。Ant任务:
但是TransformerFactory.newInstance()
将在系统类加载器上查找此类,而不一定在加载schematron任务的类加载器上查找此类
修复方法是将第120行ValidatorFactory
更改为simply
private TransformerFactory _factory = new TransformerFactoryImpl();
这将绕过所有动态查找并直接实例化正确的类。有了这个补丁
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar:lib/saxon9he.jar"/>
将正常工作
我建议你向开发人员报告这个bug,但是这个项目看起来并不特别活跃,所以你可能只需要构建自己的本地fork就可以了
private TransformerFactory _factory = new TransformerFactoryImpl();
<taskdef name="schematron"
classname="com.schematron.ant.SchematronTask"
classpath="lib/ant-schematron.jar:lib/saxon9he.jar"/>