我正在从ant构建脚本执行大量scp
和sshexec
以及其他远程命令。如果jsch.jar
不在ant lib
目录中,则这些命令不起作用。为了使它工作,我将JAR复制到ant lib
目录中,但这不是一个好的解决方案,因为任何想要运行脚本的人都必须做同样的事情。要从Teamcity运行ant目标,我们必须显式设置lib文件的路径。
有没有办法可以在ant build XML本身中指定JAR的路径?
答案 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.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。
答案 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存储库中。第二个好处是可以轻松地在所有版本中升级插件版本。