我正在从 ant 构建脚本执行许多和其他远程命令scp
。如果不在 ant目录中,sshexec
这些命令将不起作用。为了让它工作,我将 JAR 复制到了 ant目录中,但这不是一个好的解决方案,因为其他任何想要运行脚本的人都必须做同样的事情。要从 Teamcity 运行 ant 目标,我们必须明确设置 lib 文件的路径。jsch.jar
lib
lib
有没有办法可以在 ant build XML 本身中指定 JAR 的路径?
谢谢大家的回答。我设法让它与类加载器任务一起工作。这就是我所做的。
<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 附加到系统类加载器。
一种可能的解决方法是使用-lib
命令行选项告诉 ant 在哪里寻找额外的 jar。ant
也许您可以创建一个使用此选项集调用的包装脚本。
另一种方法是将ant-jsch.jar
文件(这是定义任务的 ant 附带的 jar,而不是您需要单独下载的 jsch.jar 文件)从您的 ant lib 目录中移出,并taskdef
为您的 ssh 任务单独创建一个内置的,然后将此任务的类路径设置为jsch.jar
和ant-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。
为了确保您的构建更加跨平台,我建议使用依赖管理。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 存储库中可用。第二个好处是在所有构建中升级插件版本很容易。