2009-09-22 9 views
13

chcę umieścić zestaw plików, które wyglądają jak to do słoika:Jak zmienić nazwy plików, gdy są zawarte w słoiku przez zadanie słoju mrówki?

yay/my.jar 
boo/my.jar 
foo/my.jar 
bar/my.jar 

w tym procesie, chcę je wszystkie przemianowany następująco:

yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

miałem nadzieję wykorzystać program odwzorowujący, aby to osiągnąć, ale elementy zestawu plików, których używam, i zadanie jar nie wydają się obsługiwać go w dowolnym miejscu.

Jak zastosować program odwzorowujący podczas budowania słoika, lub jak mogę przeprowadzić taką transformację? Chcę uniknąć kopiowania wszystkich plików do żądanej struktury katalogów i tworzenia duplikatów w całym miejscu, tak jak teraz działa nasz system kompilacji.

Odpowiedz

2

Aktualizacja: prawdopodobnie chcesz raczej copy task niż przenieść, ale regexp mapper działa tak samo dla kopiowania i przenoszenia.

Poniższe wyrażenie regularne skopiuje wszystkie słoiki z katalogu jar do pliku jars_out, mapując [folder]/[plik] .jar na [folder] _ [plik] .jar.

<copy todir="./jars_out"> 
    <fileset dir="jars"/> 
    <mapper type="regexp" from="([^/\\]*)[/\\](.*)\.jar$$" to="\1_\2.jar"/> 
</copy> 

Program odwzorowujący regexp potrzebuje odpowiedniego zestawu implementacji regexp w ścieżce klasy do działania. Różne implementacje są dostępne:

+0

Dodam przykład, aby pokazać, jak –

+0

To świetnie, ale nie osiąga mojego celu, jakim jest zbudowanie słoika bez wykonywania dodatkowych kopii plików. Przenieś uniknie kopii, ale wtedy słoiki zostaną odbudowane za każdym razem, gdy będę budował, zamiast tylko wtedy, gdy zmienią się pliki źródłowe. – skiphoppy

+0

Jednak stworzony przez ciebie znacznik mappera jest niesamowity i zapożyczę go, zamiast wymyślić coś takiego. :) Nie dotarłem wystarczająco daleko, by faktycznie zbudować program odwzorowujący, którego potrzebowałem, ponieważ nie mogłem w ogóle użyć żadnego narzędzia do tworzenia map z zestawem plików i słoikami. – skiphoppy

17

Można użyć zipfileset z atrybutem fullpath, aby zmienić nazwę pliku w słoiku:

<jar destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 
</jar> 

Nie możesz użyć mapper z tą techniką, będziesz musiał jawnie wymieniać każdy plik jar. Jeśli można zakładać, że każdy plik jest nazwany my.jar, i wszystkie są w bezpośrednim katalogu podrzędnego, można użyć celu subant do glob je wszystkie:

<target name="glom"> 
    <subant genericantfile="${ant.file}" target="update-jar"> 
     <dirset dir="." includes="*"/> 
    </subant> 
</target> 

<target name="update-jar"> 
    <basename file="${basedir}" property="dirname"/> 
    <property name="path" value="${dirname}_my.jar"/> 
    <jar destfile="../newjar.jar" update="yes"> 
     <zipfileset dir="." includes="my.jar" fullpath="${path}"/> 
    </jar> 
</target> 
+0

+1 Ładny łatwy sposób na zmianę nazwy pliku podczas zadania jar. Dzięki. – Damo

2

Jeśli nie chcesz (lub można bez problemu) wymieniają każdy plik osobno, jednym rozwiązaniem jest użycie zadania Zip, które pozwala zagnieżdżonemu <mappedresources> (Ant 1.8.0+). Po zakończeniu zadania Zip możesz użyć zadania Jar, aby dodać/zaktualizować manifest i/lub dodać indeks.

Załóżmy na przykład, że oprócz chcąc

 
yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

w słoiku wyjściowego, można również mieć katalog stuff/, zawierający kilka plików i podkatalogów. Jeśli chcesz zawartość stuff/ zawarte w słoiku, ale chcesz stuff/subdir/* być dodawane jako other_subdir/*, należy rozważyć następujące:

<zip destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 

    <mappedresources> 
     <fileset dir="stuff"/> 
     <compositemapper> 
      <globmapper from="subdir/*" to="other_subdir/*"/> 
      <identitymapper/> 
     </compositemapper> 
    </mappedresources> 
</zip> 
<!-- Update the newly-created ZIP in-place to add a basic manifest --> 
<jar destfile="newjar.jar" update="true"/> 

testowałem tego pliku kompilacji i współpracuje z Ant 1.8.2. Jeśli jednak po zmianie, Ant zaczyna rzucać NullPointerException, patrz Bug 54026.

Powiązane problemy