我想在ant中使用FTP任务,我找到了相应的jar文件,并且一切正常.我已将jar文件放在"libs"目录中,并与构建中使用的其他文件一起放置.唯一的问题是用户必须运行"ant -lib commons-net-ftp-2.0.jar"才能进行构建; 我真的更喜欢可以只运行没有参数的"ant".
阅读ant可选任务的安装页面,我看到有五种方法可以在ant中加载额外的库,而且它们都不是我正在寻找的.我不想强迫用户对他们的系统进行任何修改来运行这个任务; 应该可以从我们产品的源文件夹中的"libs"目录加载它.这意味着设置全局CLASSPATH也是不对的(反正这是一个坏主意).
如文档中所述,最后一个选项是首选方法...从构建脚本本身单独加载jar文件.我在过去使用ant-contrib任务和JUnit做了这个,并且想在这里做,但我不知道如何实现这一点.FTP任务不支持嵌套的classpath元素,我不知道通过taskdef加载这个库需要的XML资源.如何从ant中加载库?
编辑:回答到目前为止在这里发布的答案和问题,我正在使用ant 1.7.1.制作ftp taskdef肯定不起作用; 抛出以下错误:
BUILD FAILED /my/path/build.xml:13:taskdef class org.apache.tools.ant.taskdefs.optional.net.FTP找不到
也许这是因为classname是错误的.如果我只有一个jar文件,我究竟如何找到我应该使用的类名?它没有记录在任何地方,我在罐子里找不到任何类似于那条道路的东西.
您遇到的问题是由于使用了不同的类加载器.Commons Net类必须由加载FTP任务的同一个类加载器加载.因为在启动时Ant加载了FTP任务,所以需要将Commons Net添加到Ant的类路径中,以便它由相同的类加载器加载.这就是为什么文档为您提供了4种不同的方法.
我同意它们都不是理想的(CLASSPATH环境变量是最差的).解决此问题的一种方法是为您的项目提供一个shell脚本,该脚本调用Ant并传递apporpriate -lib参数.然后,您可以让人们使用它,而不是直接调用Ant.事实上,你可以狡猾地将它命名为'ant',以便它在路径上运行而不是现有的'ant'(这只适用于当前目录在路径上,在其他目录之前).
文档中的第五个选项理论上很棒.他们最终修复了1.7.0中的类加载问题.不幸的是,正如你所提到的,没有人改装FTP任务来采用类路径.您可以尝试提交增强请求,但这在短期内无济于事.
还有另一种选择,这种选择并不比其他选择更好.而不是确保加载FTP任务的类加载器加载Commons Net类,您可以确保加载Commons Net类的类加载器加载FTP任务.为此,您必须从Ant安装的"lib"目录中删除ant-commons-lib.jar文件.这意味着启动时不会加载FTP任务.这实际上是为什么可选任务被分解为如此多的单独JAR - 以便可以单独删除它们.将此JAR文件与Commons Net JAR文件放在一起,以便可以同时加载它.然后你可以做这样的事情(我试过这个并且它有效):
但这可能是比使用-lib开关(带或不带包装脚本)更糟糕的选择.我能想到的唯一另一件事是尝试找到第三方FTP任务而不是默认任务.
我有一个解决方案:
你可以从http://enitsys.sourceforge.net/ant-classloadertask/下载一个新的"classloader"任务并加载它:
Naw可以执行诸如使用ant用于其任务的相同类加载器加载类的操作:
或"loader ="项目""
然后你定义你的任务:
去 :-)