2012-02-15 6 views
7

Skrypt ANT build mam sposób następujący:mkdir w mrówce nie. W jaki sposób można obsłużyć ten błąd

  1. Wykonaj opiera się na serwerze Windows & pocztowy binaria
  2. zmapować dysk sieciowy z różnych poświadczeń na dysku lokalnym (EX P :) używając net use
  3. Używam <mkdir> stworzyć katalog na zamontowanym dysku (P :)
  4. Kopiuj pliki binarne do tego dysku

Poniżej jest kod dla 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> 

trochę czasu na tworzenie dzieł folderu i jakiś czas nie powiedzie się z poniższym błędem

creation was not successful for an unknown reason i sprawia, że ​​budowa nie

Ten błąd zdarza się przypadkowo. Mkdir działa przez jakiś czas. Nie jestem pewien, dlaczego nie działa i nie jest pewien, czy to z powodu opóźnienia sieciowego

również katalog, który próbuję utworzyć, może już nie istnieć. Przeczytałem, że mkdir nie robi nic, jeśli katalog istnieje już

Sprawdziłem i nie ma failonerror dla mkdir. Nie chcę, aby kompilacja zawiodła z tego powodu.

Mam obsługiwane błąd w copy części, ale nie wiem, jak sobie z tym poradzić mkdir

W jaki sposób można to osiągnąć? Każda pomoc będzie mile widziane

Pozdrowienia

Karthik

+0

jeśli nie masz nic przeciwko, czy mógłbyś skomentować moją odpowiedź i opisać, która jej część rozwiązała problem (jeśli to naprawdę rozwiązało): –

+0

czy masz uprawnienia do zapisu? – jgr208

Odpowiedz

2

Apache Ant Mkdir zadaniem jest wywołanie File.mkdirs() metodę, która jest vulnerable to race conditions.

File.mkdirs() nie jest operacją atomową - myślę, że jest zaimplementowana jako sekwencja wywołań mkdir.

W przypadku zdalnego systemu plików istnieje duża szansa, że ​​host dowie się o zmianach w systemie plików w środku operacji File.mkdirs() i nie powiedzie się.

Ant wydawało spróbować go naprawić tak Mkdir kodu zmieniło od tego w 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()); 
} 

do tego w 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()); 
} 

więc może upgrade do najnowszej Ant może pomóc?

Jeśli nie - niektóre rozszerzenia mogą zostać utworzone przy użyciu metody Mkdir z własną implementacją metody execute().

Jeśli nie - Trycatch task z Ant Contrib będzie działać.

+0

Uaktualnianie ANT. Przetestowałem z 1.7x, to nadal się nie udaje. Nie próbowałem TryCatch, ponieważ nie mam AntContrib. ale myślę, że to również pomoże mi w uchwyceniu błędu – KK99

+0

powiedział, że zmiana była pomiędzy 1.8.0 a 1.8.2, więc uaktualnienie do 1.7.x nie pomoże ... – orirab

-4

Oto jak rozwiązać go:

  1. Otwórz plik build.properties (Faktycznie otworzyć wszystkie właściwości plików odwołuje z build.xml)
  2. sprawdzać wszelkie spacje i kartami na każdej linii plik.
  3. Dodaj dodatkowy pusty wiersz na końcu pliku.
+0

Czy mogę wiedzieć, jakie jest uzasadnienie tego? –

0

Zadanie COPY można wykorzystać do tworzenia katalogów (włącznie z podkatalogami).

1

Dla mnie miałem podobny problem z wersją 1.9 mrówki.

byłem usuwając katalog i natychmiast ponownie tworząc go:

Choć katalog był lokalny (nie na dysku sieciowym), dodając sen 1 sekundę między obu operacji naprawili problem dla mnie :

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

Lub użyj [Ponów zadanie] (http://stackoverflow.com/a/23998066/2818782) – user2818782

0

Dla mnie ustalające problem w Linuksie było tak proste, jak działa jako użytkownik sudo

"sudo mrówka"

Powiązane problemy