mkdir в муравье не получается.Как я могу справиться с этой ошибкой - PullRequest
8 голосов
/ 15 февраля 2012

У меня есть скрипт сборки 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 ничего не делает, если каталог уже существует

Я проверил, и нет failonerror для mkdir. Я не хочу, чтобы сборка провалилась из-за этого.

Я обработал ошибку в copy части, но не уверен, как ее обработать mkdir

Как мне этого добиться? Любая помощь будет оценена

Привет

Karthik

Ответы [ 5 ]

2 голосов
/ 05 января 2015

Для меня у меня была похожая проблема с версией 1.9 ant.

Я удалял каталог и сразу же заново его создавал:

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

Несмотря на то, что каталог был локальным (не сетевой диск), добавление перерыва в 1 секунду между обеими операциями устранило проблему для меня:

<delete dir="${jar.dir}"/>
<sleep seconds="2"/>
<mkdir dir="${jar.dir}"/>
2 голосов
/ 15 февраля 2012

Apache Ant Mkdir задача вызывает File.mkdirs() метод, который уязвим к условиям гонки .

File.mkdirs() не является атомарной операцией - я думаю, что она реализована какпоследовательность mkdir вызовов.

В случае удаленной файловой системы существует высокая вероятность того, что ваш хост узнает об изменениях файловой системы в середине операции File.mkdirs() и он завершится неудачно.

Antказалось, пытался исправить это как Mkdir код изменился с этого в 1.8.0

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().

Еслине - Задача Trycatch от Ant Contrib будет работать.

0 голосов
/ 20 января 2017

Для меня исправить проблему в linux было так же просто, как запустить пользователя sudo

"sudo ant"

0 голосов
/ 08 октября 2014

Вы можете использовать задачу COPY для создания каталогов (включая подкаталоги).

0 голосов
/ 14 апреля 2013

Вот как я это решил:

  1. Откройте файл build.properties (фактически откройте все файлы свойств ' ссылка на build.xml)
  2. Проверьте наличие пробелов и табуляции в любой строке файла.
  3. Добавить дополнительную пустую строку в конец файла.
...