2010-02-13 19 views
6

He visto varios ejemplos diferentes y he intentado con varias variaciones, pero parece que esto no funciona correctamente. También parece que no puede excluir un directorio completo con javac, pero solo archivos, lo que supongo significa que no puede especificar un paquete. Esto es lo que tengo:Cómo excluir un paquete fuente usando javac en Ant?

<javac srcdir="src" destdir="WEB-INF/classes" excludes="path/to/excluded/package/*.java"> 
    <classpath refid="compile.classpath"/> <!-- reference defined earlier --> 
</javac> 

Respuesta

11

Puede excluir directorios enteros o árboles de directorios con "**" y excluir. Ejemplo

<dirset dir="aDirectory"> 
    <include name="a/package/**"/> 
    <exclude name="**/package/to/exclude**"/> 
</dirset> 
+0

dirset anidado no funciona con la tarea javac. –

+0

Correcto, pero como parte de un classpath que es referencias en la tarea javac deberían funcionar. – akr

5

Tenga en cuenta que excluye no funciona si alguno de los archivos en "src" (o "incluye" si se especifica) tiene la dependencia en los archivos especificados en excluye. Primero, asegúrese de que los archivos excluidos no se mencionen en ninguno de los archivos incluidos.

1

La tarea javac implícitamente incluye todos los archivos del srcdir y se puede simplemente añadir un elemento excluye a la tarea, por ejemplo:

<javac destdir="build" srcdir="src" > 
    <exclude name="**/my/package/test/*.java" /> 
</javac> 

Esto no sería compilar cualquiera de las clases en el paquete my.package.test.

+2

El problema es que cuando otra clase importa desde ese paquete, el compilador extrae ese archivo, aunque aquí indica excluirlo. Todo el elemento de incluir/excluir es solo el conjunto inicial que se envía a javac. Javac es entonces libre de extraer otros archivos, en función de los directorios src. Hay una necesidad de decirle a javac que no acceda explícitamente a ciertos archivos. Creo que esto solo se puede hacer copiando solo los archivos que está dispuesto a dar a javac, y luego compilar ese subconjunto. – Mike

+2

Esto es útil cuando tiene un paquete del que no depende otro código, como clases de prueba, que no se debe implementar. –

0

Mike, otra forma de decirle a javac explícitamente que no tiene acceso a ciertos archivos es desarmar Sourcepath. Sólo pensé que esto ...

Desde el manual de Ant:

Nota: Si desea compilar sólo los archivos fuente situada en ciertas paquetes debajo de una raíz común, utilice la inclusión/exclusión o atributos /elementos anidados para filtrar estos paquetes. Do no incluye parte de la estructura de su paquete en el atributo srcdir (o elementos anidados), o Ant recompilará sus archivos fuente cada vez que ejecuta su objetivo de compilación. Consulte las Preguntas frecuentes sobre Ant para obtener información adicional sobre .

Si desea compilar sólo los archivos especificados explícitamente y desactivar mecanismo de búsqueda por defecto de javac entonces se puede desarmar el SourcePath atributo:

<javac sourcepath="" srcdir="${src}" destdir="${build}" > 
    <include name="**/*.java"/> 
    <exclude name="**/Example.java"/> 
</javac> 

De esta forma el javac compilará todos los archivos fuente de Java en el directorio "$ {src}" pero omita los ejemplos. El compilador incluso producirá errores si algunos de los archivos que no son de ejemplo hacen referencia a ellos.

Cuestiones relacionadas