如何在ant构建文件中指定JAR的路径?

时间:2011-02-24 12:15:05

标签: ant build jar jsch build.xml

我正在从ant构建脚本执行大量scpsshexec以及其他远程命令。如果jsch.jar不在ant lib目录中,则这些命令不起作用。为了使它工作,我将JAR复制到ant lib目录中,但这不是一个好的解决方案,因为任何想要运行脚本的人都必须做同样的事情。要从Teamcity运行ant目标,我们必须显式设置lib文件的路径。

有没有办法可以在ant build XML本身中指定JAR的路径?

3 个答案:

答案 0 :(得分:5)

感谢大家的回答。我设法让它与classloader任务一起工作。这就是我所做的。

<project basedir="." >
  <property environment="env"/>

  <taskdef resource="net/jtools/classloadertask/antlib.xml">
    <classpath>
      <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/>
    </classpath>
  </taskdef>

  <!--Add JSCH jar to the classpath-->
  <classloader loader="system">
    <classpath>
      <fileset dir="${basedir}/lib" includes="jsch*.jar"/>
      </classpath>
  </classloader>

  <target name="Test">
      <scp todir="user1:pass1@server1:/tmp" trust="true" >
        <fileset dir="dir1">
          <include name="test.txt" />
        </fileset>
      </scp>
   </target>
</project>

正如你在这里看到的,我没有为我的“测试”目标提供任何依赖目标,它只是起作用。它使用classloader,它将jsch.jar附加到系统类加载器。

答案 1 :(得分:2)

一种可能的解决方法是使用-lib命令行选项告诉ant在哪里寻找其他jar。也许您可以使用此选项集创建一个调用ant的包装器脚本。

另一种方法是将你的ant lib目录中的ant-jsch.jar文件(这是定义任务的ant附带的jar,而不是需要单独下载的jsch.jar文件)和为ssh任务创建一个taskdef,与内置任务分开,然后将此任务的类路径设置为jsch.jarant-jsch.jar

<taskdef name="sshexec"
  classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec">
  <classpath>
    <pathelement location="jsch-0.1.44.jar"/>
    <pathelement location="ant-jsch.jar" />
  </classpath>
</taskdef>

我不确定这会对你有所帮助,因为它还涉及对lib目录进行更改。

据我所知,目前无法在构建文件本身中指定内置任务所需的额外jar。有一些特殊情况,比如junit。

答案 2 :(得分:1)

为确保您的构建更具跨平台性,我建议使用依赖关系管理。 ivy plug-in可以在构建时自动安装构建版本的插件。

这种方法意味着您需要安装到ANT lib中的最后一个jar是 ivy-2.2.0.jar : - )

首先在文件 ivy.xml

中声明项目的依赖项
<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="anttask" description="Jars implementing ANT tasks"/>
    </configurations>
    <dependencies>
        <dependency org="com.jcraft" name="jsch" rev="0.1.42" conf="anttask->default"/>
    </dependencies>
</ivy-module>

build.xml 中运行常春藤并使用它根据常春藤配置填充自定义类路径:

<target name='init' description='Resolve project dependencies and set classpaths'>
    <ivy:resolve/>
    <ivy:cachepath pathid="anttask.path" conf="anttask"/>
</target>

最后,你的构建中的其他地方使用类路径声明你的ANT任务现在由常春藤自动填充。

<target name='dosomething' depends="init">
    <taskdef name="sshexec" 
             classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
             classpathref="anttask.path"/>
    ..
    ..
</target>

此方法适用于所有ANT插件,其中大多数插件位于中央Maven存储库中。第二个好处是可以轻松地在所有版本中升级插件版本。