ANT FTP任务抛出奇怪的错误

时间:2013-11-28 20:22:31

标签: ant ftp ant-contrib

我在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试图解析我试图传输的文件的二进制数据中的替换。

经过多次试验和错误,我找到了原因。答案如下!

1 个答案:

答案 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>