我在ANT 1.9.1中遇到了ftp任务的问题
这是我的ftp macrodef:
<target name="checkAntCommons">
<!-- Test if ant commons-net jar is present -->
<echo message="checking for ${ant.library.dir}/commons-net-1.4.1.jar"/>
<if>
<available file="${ant.library.dir}/commons-net-1.4.1.jar" type="file" />
<then>
<echo message="ANT commons-net library is available"/>
</then>
<else>
<echo message="ANT commons-net library is not available" />
<copy file="${ANT_ROOT}/commons-net-1.4.1/commons-net-1.4.1.jar" todir="${ant.library.dir}"/>
<fail status="0" message="Must re-run build for changes to take effect" />
</else>
</if>
</target>
<target name="checkJakartaOro">
<!-- Test if ant jakarta-oro jar is present -->
<echo message="checking for ${ant.library.dir}/jakarta-oro-2.0.8.jar"/>
<if>
<available file="${ant.library.dir}/jakarta-oro-2.0.8.jar" type="file" />
<then>
<echo message="jakarta-oro library is available"/>
</then>
<else>
<echo message="jakarta-oro library is not available" />
<copy file="${ANT_ROOT}/jakarta-oro-2.0.8/jakarta-oro-2.0.8.jar" todir="${ant.library.dir}"/>
<fail status="0" message="Must re-run build for changes to take effect" />
</else>
</if>
</target>
<macrodef name="deploySite" description="Deploy site files to ftp">
<sequential>
<antcall target="checkAntCommons"/>
<antcall target="checkJakartaOro"/>
<ftp userid="*******" password="*******"
server=***.***.***.***"
remotedir="/site/assets/foo"
port="21"
verbose="true"
action="send"
passive="yes"
systemTypeKey="UNIX"
>
<fileset dir="./deploy">
<includesfile name="deploy/foo.swf"/>
</fileset>
</ftp>
</sequential>
</macrodef>
<target name="deploy" description="deploy foo files">
<deploySite/>
</target>
我知道我成功连接到我的服务器,因为如果我更改了密码,我会收到登录错误,如果我输入了正确的密码,我就会遇到问题。我也一直通过filezilla连接。这不是并发连接的问题,因为我没有限制。
当我运行此任务时,我得到以下输出:
$ ant deploy
Buildfile: f:\var\projects\hof\svn2.-----------------.com\lobby\trunk\build.xml
deploy:
checkAntCommons:
[echo] checking for F:\bin\ant\lib/commons-net-1.4.1.jar
[echo] ANT commons-net library is available
checkJakartaOro:
[echo] checking for F:\bin\ant\lib/jakarta-oro-2.0.8.jar
[echo] jakarta-oro library is available
[ftp] sending files
BUILD FAILED
f:\var\projects\hof\svn2.-----------------------.com\lobby\trunk\build.xml:324: The following error occurred while executing this line:
f:\var\projects\hof\svn2.-----------------------.com\lobby\trunk\build.xml:309: Syntax error in property: ${ c6W∟5⌂[6▄≈☻wä5↓╚╞K▐Bd≡6?k╥<╞:èbE▒9≡'╗î£Θ┼è├≤╘r≤?öæCu½╞╖§Σ ç▓(σⁿ.?n≡PßΘéK┼ ΣRq!╣T,ò■Ä╠W3║»æ ?√i
╩↑↓UQa{σ▼î¼≈Lpt■┼Ç☻/α┐┘D`╬!`8&├ òƒ Üj▲?╔ 1Q.ô²¢┴┌Ça£∙▒∙Oækñcl╜vÑl^)w╠G╒╠gäêyPε╘╟7░═µu╚¡I┐N6»º4%▒ƺ≥á=⌂î5←7╚µ
Total time: 3 seconds
我的macrodef中绝对没有变量。在我看来,由于某种原因,ANT试图解析我试图传输的文件的二进制数据中的替换。
经过多次试验和错误,我找到了原因。答案如下!
答案 0 :(得分:0)
答案是文件集元素错误:
<fileset dir="./deploy">
<includesfile name="deploy/foo.swf"/>
</fileset>
该元素以某种方式读取垃圾,从而导致蚂蚁任务完全无法预测。
这样做:
<fileset>
<include name="@{file-name}"/>
</fileset>
最终的工作解决方案是:
<macrodef name="deployFile" description="Deploy foo to *******">
<attribute name="file-name" default="none" />
<attribute name="path" default="." />
<attribute name="remote-dir" default="." />
<sequential>
<property name="needToResend" value="false"/>
<antcall target="checkAntCommons"/>
<antcall target="checkJakartaOro"/>
<trycatch>
<try>
<echo message="trying to upload ${basedir}/@{path}/@{file-name} to @{remote-dir}"/>
<sendFTPFile file-name="@{file-name}" path="${basedir}/@{path}" remote-dir="@{remote-dir}"/>
</try>
<catch>
<echo message="${basedir}/@{path}/@{file-name} exists in @{remote-dir}"/>
<deleteFTPFile file-name="@{file-name}" remote-dir="@{remote-dir}"/>
<property name="needToResend" value="true"/>
</catch>
</trycatch>
<if>
<equals arg1="${needToResend}" arg2="true"/>
<then>
<echo message="re-uploading ${basedir}/@{path}/@{file-name} to @{remote-dir}"/>
<sendFTPFile file-name="@{file-name}" path="${basedir}/@{path}" todir="@{remote-dir}"/>
</then>
</if>
</sequential>
</macrodef>
<macrodef name="sendFTPFile" description="send a file to FTP">
<attribute name="file-name" default="none" />
<attribute name="path" default="." />
<attribute name="remote-dir" default="." />
<sequential>
<echo message="sending @{path}/@{file-name} to @{remote-dir}"/>
<ftp userid="****" password="********"
server="***.***.***.***"
remotedir="@{remote-dir}"
port="21"
verbose="true"
action="send"
passive="yes"
systemTypeKey="UNIX"
ignorenoncriticalerrors="true"
>
<fileset dir="@{path}">
<include name="@{file-name}"/>
</fileset>
</ftp>
</sequential>
</macrodef>
<macrodef name="deploySite">
<sequential>
<deployFile file-name="foo.bar" path="${DEPLOY_DIR}" remote-dir="/foo/bar/baz"/>
<deployFile file-name="*.bar" path="${DEPLOY_DIR}/blah" remote-dir="/foo/bar/baz/blah"/>
</sequential>
</macrodef>