8

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

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

下面是我的代码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 不会做任何事情

我查了一下,没有failonerrormkdir。我不希望构建因此而失败。

我已经copy部分处理了错误,但不知道如何处理mkdir

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

问候

卡尔提克

4

5 回答 5

2

Apache AntMkdir任务正在调用易受竞争条件影响的File.mkdirs()方法。

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

在远程文件系统的情况下,您的主机很有可能在File.mkdirs()操作过程中意识到文件系统更改并且它失败了。

Ant 似乎试图修复它,因为1.8.0Mkdir中的代码从这里发生了变化

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 任务将起作用。

于 2012-02-15T09:58:45.387 回答
2

对我来说,我在 1.9 版本的 ant 中遇到了类似的问题。

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

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

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

<delete dir="${jar.dir}"/>
<sleep seconds="2"/>
<mkdir dir="${jar.dir}"/>
于 2015-01-05T13:03:29.327 回答
0

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

于 2014-10-08T12:16:14.360 回答
0

对我来说,在 linux 中解决问题就像以 sudo 用户身份运行一样简单

“须藤蚂蚁”

于 2017-01-20T17:09:45.383 回答
-4

这是我解决它的方法:

  1. 打开您的 build.properties 文件(实际上打开了从 build.xml 引用的所有属性文件)
  2. 检查文件任何行上的任何尾随空格和制表符。
  3. 在文件末尾添加一个额外的空行。
于 2013-04-14T12:02:36.190 回答