使用Ant将第三方JAR的类路径设置为包括另一个JAR的路径

3
如何在Ant中设置classpath以包含第二个第三方JAR?这与运行this site上的基本使用Schematron with ANT示例有关。该示例说明在页面顶部链接的一个短PDF中。我直接从PDF中将所有文件的内容复制粘贴到Eclipse中。然后,我从上述网站下载了ant-schematron-2010-04-14.jar,并从SAXON SourceForge页面获取了saxon9he.jar。我还更改了构建文件以匹配。不带注释的行号如下:
09 <project name="schematron-ant-sample" default="validate">
14     <taskdef name="schematron"
15              classname="com.schematron.ant.SchematronTask"
16              classpath="lib/ant-schematron-2010-04-14.jar; lib/saxon9he.jar" />
22     <target name="validate" description="Test with a Fileset">
23         <schematron schema="sch/sample.sch" failonerror="false">
24             <fileset dir="xml" includes="*.xml" />
25         </schematron>
26     </target>
27 </project>

当我运行构建文件时,出现了以下错误:
validate:

BUILD FAILED
C:\Users\gdawes\Documents\workspace\SchematronAntExample\build.xml:23: /
javax.xml.transform.TransformerFactoryConfigurationError: Provider /
net.sf.saxon.TransformerFactoryImpl not found

Total time: 265 milliseconds

如果在“schematron”的类路径中没有列出SAXON JAR文件,将会发生类似的错误。我已经确认“TransformerFactoryImpl”存在于SAXON JAR文件中,但我无法弄清楚如何使Schematron代码识别它。我应该如何设置类路径?(或者,如果我错了,这不是一个类路径问题,那么我该如何使构建成功?)
2个回答

2
<taskdef>中的classpath应该只包含:lib/ant-schematron-2010-04-14.jar,与使用Schematron进行Ant构建的示例中提供的示例类似。请注意保留HTML标签。
<?xml version="1.0" encoding="UTF-8"?>
<project name="schematron-ant-sample" default="validate">
  <taskdef name="schematron"
      classname="com.schematron.ant.SchematronTask"
      classpath="lib/ant-schematron-2010-04-14.jar" />
  <target name="validate" description="Test with a Fileset">
    <schematron schema="sch/sample.sch" failonerror="false">
      <fileset dir="xml" includes="*.xml" />
    </schematron>
  </target>
</project>

除了更正<taskdef>,将saxon9he.jar放置在Ant库文件夹中还可以使net.sf.saxon.TransformerFactoryImpl可用,从而解决错误(在Ubuntu Linux和Ant 1.8.2上进行了测试)。


你是指 {ANT_HOME}\lib 吗? - Pops
我知道这一点,这也是我尝试的第一件事。我在问题描述中提到它没有起作用。不同之处在于它是一个NoClassDefFoundError,而不是一个TransformerFactoryConfigurationError。如果我再次编辑问题,我会把这个加进去(似乎本身并不重要)。 - Pops
我继续尝试了一下。奇怪的是,虽然在Eclipse中构建仍然失败,但从命令行运行却成功了。我确实重新启动了Eclipse。我想知道它是否使用了独立安装的Ant。 - Pops
1
我认为Ant会自动在其${ant.home}/lib目录中获取条目,而Eclipse则需要您使用“External Tools Configuration”窗口的“Classpath”选项卡手动添加它们。 - davidfmatheson
1
@davidfmatheson 哈哈!我的Classpath选项卡(通过Run > External Tools > External Tools Configurations访问)显示Eclipse认为ANT_HOME指的是C:\Users\gdawes\MyEclipse\Common\plugins\org.apache.ant_1.7.1\lib的内容。将SAXON JAR添加到该位置可以使Eclipse正常工作。 - Pops
显示剩余3条评论

1
如果我没记错的话,taskdef 上的 classpath 只是用于查找要加载的类的 classpath,而不是任务实际运行的 classpath。尝试将所需的 jar 添加到 Eclipse 中 Ant 构建配置的 Classpath 选项卡的 User Entries 部分中。

这样做就可以了。将SAXON JAR放在taskdef的类路径中是不必要的,但也无害。供以后参考,可以通过右键单击构建文件并选择“Run As > External Tools Configuration...”或者选择“Run > External Tools > External Tools Configurations”来访问Classpath选项卡。 - Pops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接