我正在从ant构建脚本中执行大量的scp、sshexec和其他远程命令。如果ant lib目录中没有jsch.jar,则这些命令无法正常工作。为了使其正常工作,我将JAR文件复制到ant lib目录中,但这不是一个好的解决方案,因为任何想要运行该脚本的人都必须做同样的事情。要从Teamcity运行ant目标,我们必须明确设置lib文件的路径。
有没有一种方法可以在ant构建XML本身中指定JAR的路径?
有没有一种方法可以在ant构建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>
如您所见,我没有为“Test”目标指定任何依赖目标,它可以正常工作。它使用类加载器,将jsch.jar附加到系统类加载器中。
一个可能的解决方法是使用-lib
命令行选项告诉ant在哪里查找额外的jar包。或许你可以创建一个包装脚本,调用设置了这个选项的ant
。
另一种方法是将ant-jsch.jar
文件(这是随ant一起提供的定义任务的jar,而不是您需要单独下载的jsch.jar文件)移出ant lib目录,并为您的ssh任务创建一个独立于内置任务的taskdef
,然后将此任务的类路径设置为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>
<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>
<target name='init' description='Resolve project dependencies and set classpaths'>
<ivy:resolve/>
<ivy:cachepath pathid="anttask.path" conf="anttask"/>
</target>
<target name='dosomething' depends="init">
<taskdef name="sshexec"
classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"
classpathref="anttask.path"/>
..
..
</target>
这种方法适用于所有ANT插件,其中大多数都可以在中央Maven存储库中获得。第二个好处是可以轻松升级所有构建中的插件版本。
depends="init"
。我正在寻找更像“一次更改,适用于所有”的选项。 - Ravi