Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在build.xml中设置ANT类路径_Java_Ant_Schematron - Fatal编程技术网

Java 在build.xml中设置ANT类路径

Java 在build.xml中设置ANT类路径,java,ant,schematron,Java,Ant,Schematron,这个问题已经被问了好几次,但我并不十分满意。我并不是真的对提议的变通办法感兴趣,而是对如何做我真正想做的事感兴趣 我希望得到一个令人满意的解释,解释为什么这是不可能的,如果不是的话,因为我会建议自己提交一个修复方案,我希望了解为什么没有尝试过一些看起来如此简单的东西 目前,为了确保ant可以使用一组JAR,必须应用以下方法之一: 添加到CLASSPATH环境变量中,文档中的“不推荐” 添加到$ANT\u HOME/lib或~/.ANT/lib-需要在生成环境中进行配置 在ant调用上设置-li

这个问题已经被问了好几次,但我并不十分满意。我并不是真的对提议的变通办法感兴趣,而是对如何做我真正想做的事感兴趣

我希望得到一个令人满意的解释,解释为什么这是不可能的,如果不是的话,因为我会建议自己提交一个修复方案,我希望了解为什么没有尝试过一些看起来如此简单的东西

目前,为了确保ant可以使用一组JAR,必须应用以下方法之一:

  • 添加到
    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"/>