2009-09-22 23 views
13

Quiero poner un conjunto de archivos que se parecen a esto en un frasco:¿Cómo cambio el nombre de los archivos cuando se incluyen en un jar por la tarea jar de horm?

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

En el proceso, quiero todos ellos sustituye por el siguiente:

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

que estaba esperando para usar un mapeador para lograr esto, pero los elementos del conjunto de archivos que estoy usando y la tarea jar no parecen apoyarlo en ninguna parte.

¿Cómo aplico un asignador cuando construyo un jar, o bien, cómo puedo realizar una transformación como esta? Quiero evitar copiar todos los archivos a la estructura de directorios que quiero y hacer duplicados por todas partes, que es como funciona nuestro sistema de compilación ahora.

Respuesta

2

Actualización: probablemente desee copy task en lugar de mover, pero regexp mapper funciona igual para copiar y mover.

La siguiente expresión regular copiará todos los archivos jar en el directorio jar a jars_out, mapeo [carpeta]/[archivo] .jar a [carpeta] _ [archivo] .jar.

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

El correlacionador de regexp necesita un jar de implementación de expresiones regulares apropiado en el classpath para trabajar. Varias implementaciones están disponibles:

+0

Voy a agregar un ejemplo para mostrar cómo –

+0

Eso es genial, pero no logra mi objetivo de construir el contenedor sin hacer copias adicionales de los archivos. Mover evitaría copias, pero luego las jarras se reconstruirían cada vez que construyera en lugar de solo si sus archivos de origen han cambiado. – skiphoppy

+0

Sin embargo, la etiqueta del mapeador que construiste es impresionante, y tomaré prestado eso en lugar de crear uno propio. :) No había llegado lo suficientemente lejos como para construir realmente el asignador que necesitaba, ya que no podía obtener ningún mapeador para trabajar con el conjunto de archivos y jar. – skiphoppy

17

Se puede utilizar un zipfileset con un atributo fullpath cambiar el nombre del nombre de archivo en el frasco:

<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> 

No puedes usar Sin embargo, un mapeador con esta técnica, deberá enumerar cada archivo jar explícitamente. Si se puede asumir que cada archivo se llama my.jar, y todos ellos están en un directorio secundario inmediato, se puede usar el objetivo subant a glob a todos ellos:

<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 Una manera fácil y sencilla de cambiar el nombre de un archivo durante la tarea jar. Gracias. – Damo

2

Si no quiere (o puede 't fácilmente) lista cada archivo individualmente, una solución es usar la tarea Zip, que permite un <mappedresources> anidado (Ant 1.8.0+). Una vez que se completa la tarea Zip, puede usar la tarea Jar para agregar/actualizar el manifiesto y/o agregar un índice.

Supongamos, por ejemplo, que, además de querer

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

en el JAR de salida, también tienen un directorio stuff/, que contiene algunos archivos y subdirectorios. Si desea que los contenidos de stuff/ incluido en el JAR, pero desea stuff/subdir/* que se añade como other_subdir/*, considere lo siguiente:

<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"/> 

He probado esto fichero de construcción y funciona con Ant 1.8.2. Sin embargo, si después de cambiarlo Ant comienza a arrojar un NullPointerException, vea Bug 54026.

Cuestiones relacionadas