Pregunta

He heredado un sistema de construcción Ant que contiene muchos recursos definiciones de conjuntos como este:

<files id="app1.lib.jars">
  <include name="${java}/jre/lib/jsse.jar"/>
  <include name="${work.lib}/jtidy.jar"/>
  ...
</files>

<files id="app2.lib.jars">
  <include name="${work.lib}/itext.jar"/>
  <include name="${work.lib}/commons-httpclient.jar"/>
  ...
</files>

<files id="app3.lib.jars">
  <include name="${work.lib}/jdom.jar"/>
  <include name="${ant.lib}/ant.jar"/>
  ...
</files>

Hay tal vez una docena de ellos, y cada uno puede contener desde 5 a 50 archivos. El problema es que estoy reelaboración de este sistema para su uso Ivy para la gestión de la dependencia, y en el proceso de algunas de las referencias ahora apuntan a archivos inexistentes. Por desgracia, la hormiga hace no proporciona ninguna ayuda para encontrar estos malos punteros. Cuando estos recursos colecciones se utilizan para definir una ruta de clase ninguna etiqueta <include...> señalando a los archivos que faltan se ignora silenciosamente.

pensé que podría forzar un error mediante el uso de las colecciones como la fuente de un <copy...>, pero incluso con sólo failonerror="true" ignorado las malas referencias.

opción

El -v de línea de comandos (detallado) y -d (depuración) no ayudó ya sea. La salida reconoció que algunos habían desaparecido, pero no lo hizo En realidad mostrarles

 [echo] app1.lib.jars
 [copy] C:\dev\src\tomcat6\work\java\jre\lib\jsse.jar omitted as C:\dev\src\tomcat6\work\verify\jsse.jar is up to date.
 [copy] C:\dev\src\tomcat6\work\lib\axis-ant.jar omitted as C:\dev\src\tomcat6\work\verify\axis-ant.jar is up to date.
 ...
 [copy] No sources found.
 [echo] app2.lib.jars
 ...

Para una solución de una sola vez que extrae todos los nombres de archivo de la conjuntos de recursos en el archivo de Ant y compararon con un listado de directorio del resultado de copiar todos los archivos (en ANT) en un temporal directorio, después de la clasificación adecuada.

Pregunta: ¿Hay una manera de conseguir Ant me diga cuando unos puntos de recursos a un archivo que falta, preferiblemente en el momento se ha definido el recurso?

¿Fue útil?

Solución

El siguiente es un ejemplo de un método. Puntos clave

  • Convierte tu files a filelists - estos pueden contener nombres de archivos que no existen en el sistema de archivos, a diferencia de los conjuntos de archivos y ficheros, que ignoran las entradas que no existen
  • restringir para comprobar la existencia
  • Utilice un fail a un error cuando falta algo

Usted tendrá que añadir el "antlib: org.apache.tools.ant.types.resources.selectors" espacio de nombres al proyecto para utilizar los selectores de recursos que se muestran a continuación. Usted va a golpear inconvenientes con las versiones mayores de Ant 1.7.0.

<project name="so" default="checkfiles" basedir="."
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">

<filelist id="app1.lib.jars">
  <file name="${java}/jre/lib/jsse.jar"/>
  <file name="${work.lib}/jtidy.jar"/>
  ...
</filelist>

<restrict id="missing.app1.lib.jars">
  <filelist refid="app1.lib.jars"/>
  <rsel:not>
    <rsel:exists/>
  </rsel:not>
</restrict>

<property name="missing.files" refid="missing.app1.lib.jars" />
<fail message="These files are missing: ${missing.files}">
  <condition>
    <length string="${missing.files}" when="greater" length="0" />
  </condition>
</fail>
<pathconvert property="found.files" refid="app1.lib.jars" />
<echo message="Found files ${found.files}" />

Como alternativa, puede utilizar la tarea de 'copia', como usted sugiere, pero con listas de archivos en lugar de archivos. La copia debe fallar cuando intenta procesar el primer recurso que no existe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top