蚂蚁的mkdir失败了。我该如何处理这个错误

时间:2012-02-15 09:14:41

标签: java ant mkdirs

我的ANT构建脚本执行以下操作:

  1. 在Windows服务器上执行构建&拉链二进制文件
  2. 使用net use
  3. 将具有不同凭据的网络驱动器映射到本地驱动器(例如P :)
  4. 我正在使用<mkdir>在已安装的驱动器(P :)
  5. 上创建目录
  6. 将二进制文件复制到该驱动器
  7. 以下是mkdir

    的代码
    <echo>Creating ${buildRequesterUserId} folder at mirroring site starts</echo>
    <mkdir dir="P:\build_output\${buildRequesterUserId}"/>
    <echo>Creating ${buildRequesterUserId} folder at mirroring site ends</echo>
    

    有时候文件夹的创建有效,有些时候失败并出现以下错误

    creation was not successful for an unknown reason并使构建失败

    此错误随机发生。 Mkdir工作了一段时间。我不确定它为什么会失败并且不确定它是否因为网络滞后而

    我正在尝试创建的目录可能已经存在,也可能不存在。我读到如果目录已经存在,mkdir不会做任何事情

    我检查过mkdir没有failonerror。我不希望构建因此而失败。

    我已处理copy部分中的错误,但不确定如何处理此mkdir

    我怎样才能做到这一点?任何帮助将不胜感激

    此致

    KARTHIK

5 个答案:

答案 0 :(得分:2)

Apache Ant Mkdir任务正在调用File.mkdirs()方法vulnerable to race conditions

File.mkdirs()不是原子操作 - 我猜它是作为一系列mkdir调用来实现的。

如果是远程过滤系统,您的主机很有可能在File.mkdirs()操作过程中意识到文件系统更改,并且失败。

Ant似乎尝试修复它,因为1.8.0

中的Mkdir代码已从此更改
boolean result = mkdirs(dir);
if (!result) {
  String msg = "Directory " + dir.getAbsolutePath()
         + " creation was not successful for an unknown reason";
  throw new BuildException(msg, getLocation());
}
1.8.2

boolean result = mkdirs(dir);
if (!result) {
  if (dir.exists()) {
    log("A different process or task has already created "
         + "dir " + dir.getAbsolutePath(),
         Project.MSG_VERBOSE);
    return;
  }
  String msg = "Directory " + dir.getAbsolutePath()
         + " creation was not successful for an unknown reason";
  throw new BuildException(msg, getLocation());
}

所以升级到最新的Ant可能会有所帮助吗?

如果没有 - 可以使用您自己的Mkdir方法实现创建一些强力execute()任务扩展。

如果没有 - 来自Ant Contrib的Trycatch task将起作用。

答案 1 :(得分:2)

对我来说,我对1.9版本的ant有类似的问题。

我正在删除目录并立即重新创建它:

<delete dir="${jar.dir}"/>
<mkdir dir="${jar.dir}"/>

即使目录是本地的(不是网络驱动器),在两个操作之间添加1秒的睡眠也为我解决了这个问题:

<delete dir="${jar.dir}"/>
<sleep seconds="2"/>
<mkdir dir="${jar.dir}"/>

答案 2 :(得分:0)

您可以使用COPY任务创建目录(包含子目录)。

答案 3 :(得分:0)

对我来说,修复linux中的问题就像运行sudo用户一样简单

&#34; sudo ant&#34;

答案 4 :(得分:-4)

以下是我如何解决它:

  1. 打开build.properties文件(实际打开所有属性文件&#39; 从build.xml引用)
  2. 检查文件任何行上的任何尾随空格和制表符。
  3. 在文件末尾添加一个空白行。