8

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

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

4

3 回答 3

5

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

<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>

正如您在此处看到的,我不必为我的“测试”目标提供任何依赖目标,它就可以工作。它使用类加载器,将 jsch.jar 附加到系统类加载器。

于 2011-02-25T11:06:30.223 回答
2

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

另一种方法是将ant-jsch.jar文件(这是定义任务的 ant 附带的 jar,而不是您需要单独下载的 jsch.jar 文件)从您的 ant lib 目录中移出,并taskdef为您的 ssh 任务单独创建一个内置的,然后将此任务的类路径设置为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。

于 2011-02-24T16:35:38.050 回答
1

为了确保您的构建更加跨平台,我建议使用依赖管理。ivy 插件可以在构建时自动安装您构建的插件版本。

这种方法意味着您需要安装到 ANT 库中的最后一个 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中运行 ivy 并使用它来填充基于 ivy 配置的自定义类路径:

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

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

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

这种方法适用于所有 ANT 插件,其中大部分都在中央 Maven 存储库中可用。第二个好处是在所有构建中升级插件版本很容易。

于 2011-02-24T18:16:22.710 回答