2009-05-06 15 views
8

Estoy más acostumbrado a hacer, así que estoy confundido por qué la hormiga recompila clases cuando la fuente no ha sido cambiada. He leído que hay un requisito para recompilar en algunos casos donde se usan genéricos, pero no estoy seguro de que esto sea necesario para mi proyecto.¿Por qué la hormiga compila todas las clases en cada ejecución?

Además, en la tarea javac, me he fijado includeDestClasses = "true"

He aquí algunos de los objetivos que estoy usando

<target name="init"> 
     <mkdir dir="${build}"/> 
     <mkdir dir="${dist}"/> 
    </target> 
    <target name="compile" depends="init,util,semantics" description=""/> 
    <target name="util" depends="" description=""> 
     <javac destdir="${build}" classpath="project.class.path" debug="on" srcdir="${src}/util" includeDestClasses="true" source="1.5"> 
      <classpath refid="project.class.path"/> 
     </javac> 
    </target> 

Respuesta

9

Intente modificar la etiqueta de apertura de la tarea javac incluir tanto un atributo y un atributo srcdirincludes:

<javac destdir="${build}" classpath="project.class.path" debug="on" srcdir="${src}" includes="util/**" includeDestClasses="true" source="1.5">

+0

Esto parece funcionar, ¿alguna idea de por qué? –

+4

Sí, cuando la hormiga busca los archivos fuente que han cambiado, no lee el contenido de ningún archivo, en particular, no lee la declaración del paquete de ninguna clase. En cambio, infiere el nombre completo de una clase desde su nombre de archivo y su ubicación en la jerarquía del directorio de origen. Entonces, por ejemplo, puede haber tenido una clase util.codec.Base64 cuyo código fuente estaba en $ {src} /util/codec/Base64.java, pero su tarea javac infería su nombre completo como codec.Base64 porque le dijiste que la raíz de la jerarquía del código fuente estaba en $ {src}/util en lugar de $ {src}. –

1

En mi experiencia el objetivo javac no se compilará todos las clases, solo las que lo necesitan, incluso sin el atributo includeDestClasses. De hecho, generalmente configuro dos (o más) objetivos de compilación, uno que hace una compilación completa (forzada al eliminar el directorio de salida) y otra que hace una compilación de actualización rápida, muy similar a su línea javac. ¿Estás seguro de que una de tus dependencias no está eliminando el directorio de salida?

+0

Estoy bastante seguro, acabo de ejecutar uno de los objetivos secundarios y las marcas de tiempo se actualizaron en mi directorio de destino. –

+0

Estoy usando 1.7.0, no 1.7.1. Lo intenté después de editar un archivo, y obtuve un "[javac] Compilación de 1 archivo fuente para ..." ¿Qué sucede sin el atributo includeDestClasses? La salida de tu hormiga debería indicar cuántos archivos se están compilando. – Glenn

7

Los directorios de src & dest no son equivalentes, por lo que hormiga no puede determinar con eficacia los archivos de salida para compararlos.

Este es un FAQ: http://ant.apache.org/faq.html#always-recompiles

+0

Los atributos src y dest son específicamente diferentes para mantener la jerarquía del paquete. –

Cuestiones relacionadas