如何使用ant将文件从Unix共享复制到Windows机器?

时间:2015-07-03 13:32:05

标签: unix ant jenkins ant-contrib

我在Unix机器上有一些文件可以通过Windows资源管理器使用\ host \目录从我的Windows PC访问

但是,当使用ant copy任务时,ant继续说该目录不存在......

所以,蚂蚁部分是:

<if>
    <available file="${unix-dbs-dir}" type="dir" />
    <then>
        <echo message="${unix-dbs-dir} exists"/>
    </then>
    <else>
        <echo message="${unix-dbs-dir} doesn't exist"/>
    </else>
</if>

<copy todir="${dbsDir}" verbose="true">
    <fileset dir="${unix-dbs-dir}">
        <include name="*.bd"/>
    </fileset>
</copy>

这个输出是:

15:28:42      [echo] \\hyperion\dbs doesn't exist
15:28:42 
15:28:42 BUILD FAILED
15:28:42 ... \\hyperion\dbs does not exist.

如果我尝试使用远程Windows网络路径,它确实有用......

知道怎么解决这个问题吗?似乎很奇怪,我可以使用我的Windows资源管理器访问\ hyperion \ dbs,但蚂蚁显然不能...

Unix是CentOs 6.5,但我想这没关系。

一些额外的信息。我创建了一个小的build.xml脚本,用于将文件从Unix机器复制到Windows机器。如果我从命令行执行build.xml ant脚本(顺便不以管理员身份启动),则输出为:

C:\Users\lievenc\TestCopyHyperion>%ANT_HOME%/bin/ant.bat -lib lib
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre1.8.
0_45\lib\tools.jar
Buildfile: C:\Users\lievenc\TestCopyHyperion\build.xml
     [echo] Load them from directory \\srv-linuxdev\pde\appl\samplenet\dbs
     [echo] \\srv-linuxdev\pde\appl\samplenet\dbs exists
     [copy] Copying 1 file to C:\Users\lievenc\TestCopyHyperion
     [copy] Copying \\srv-linuxdev\pde\appl\samplenet\dbs\apif.d to C:\Users\lievenc\TestCopyHyperion\apif.d

从Jenkins执行此build.xml脚本时,我得到以下输出:

[workspace] $ cmd.exe /C '"C:\Jenkins\tools\hudson.tasks.Ant_AntInstallation\1.9.4\bin\ant.bat -lib lib && exit %%ERRORLEVEL%%"'
Buildfile: C:\Jenkins\jobs\test-copying-from-hyperion\workspace\build.xml
     [echo] Load them from directory \\srv-linuxdev\pde\appl\samplenet\dbs
     [echo] \\srv-linuxdev\pde\appl\samplenet\dbs doesn't exist

似乎无法弄清楚区别是什么。 cmd.exe必须像其他用户一样执行吗?我只是在这里猜测,但是从我在Windows的命令行中,我正在以域用户身份执行ant。也许这和詹金斯不同?

Ant脚本:

<?xml version="1.0"?>

<project basedir="." xmlns:ac="antlib:net.sf.antcontrib">

    <!-- antcontrib -->
    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

    <echo message="Load them from directory \\srv-linuxdev\pde\appl\samplenet\dbs" />

    <if>
        <available file="\\srv-linuxdev\pde\appl\samplenet\dbs" type="dir" />
        <then>
            <echo message="\\srv-linuxdev\pde\appl\samplenet\dbs exists"/>
        </then>
        <else>
            <echo message="\\srv-linuxdev\pde\appl\samplenet\dbs doesn't exist"/>
        </else>
    </if>

    <copy todir="${basedir}" verbose="true">
        <fileset dir="\\srv-linuxdev\pde\appl\samplenet\dbs">
            <include name="apif.d"/>
        </fileset>
    </copy>

</project>

1 个答案:

答案 0 :(得分:2)

  

似乎无法弄清楚区别是什么。 cmd.exe必须像其他用户一样执行吗?

100%。不仅用户不同,%PATH%也是如此,以及您可能已缓存的任何凭据。此外,您的ant可执行文件也不同。从cmd开始,你有%PATH%的任何应对措施。运行Jenkins,使用Jenkins的一个安装。然而,这不是问题。

Jenkins用户取决于你如何设置它。如果是Windows服务,请通过“Windows服务”对话框管理用户,将其从“本地系统”更改为您更熟悉的内容,例如您自己的用户。

首先要检查几件事。

  • 你能不能通过Jenkins对主机进行ping操作 配置“执行批处理命令”步骤,然后键入ping srv-linuxdev。通过詹金斯执行。看看是否有效。

  • 如果您完全省略available标记,是否还可以复制文件?

  • 如何设置权限以访问Linux共享?是100%开放吗?对于哪个用户?我没有看到您的案件中传递任何凭据。凭据是否缓存在您的用户会话中?这一切都与作为不同用户的Jenkins有关。