2010-06-30 8 views
15

tengo el siguiente en mi build.xml:¿Cómo puedo excluir fuentes en una tarea javac en hormiga?

<target name="compile.baz" depends="init"> 
    <javac destdir="${build.dir}/classes" debug="on"> 
     <compilerarg value="-Xlint:deprecation"/> 
     <src> 
     <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
     <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
     <!-- Need to exclude ${src.dir}/com/foo/bar/quux/dontwant/ --> 
     </src> 
     <classpath refid="classpath.jars" /> 
    </javac> 
    ... 
</target> 

Este mayoría hace lo que yo quiero, excepto que (como dice el comentario) que hago no quieren que los archivos en
${src.dir}/com/foo/bar/quux/dontwant/ ser compilado por esta tarea (pero quiero todo lo demás bajo ${src.dir}/com/foo/bar/quux/ para compilar en esta tarea).

Soy una hormiga completa n00b, y la documentación no me ha ayudado mucho. Veo varios lugares donde dice que hay varios elementos/atributos de exclusión/exclusión, pero cada variación que puedo pensar no tiene ningún efecto o da como resultado un error como "blah no admite el atributo 'excluir'".

Respuesta

16

Algunas personas sugirieron usar <exclude>. Esto no funcionó con la forma en que se especificó mi tarea. la respuesta de trashgod vinculada al the sixth example on this page que me dio una idea de cómo reestructurar la especificación de mi tarea.

Parece que mi problema estaba relacionado con la forma en que estaba especificando los archivos de origen. En lugar de utilizar <pathelement> elementos en un <src>, como este:

<src> 
    <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
    <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
</src> 

I cambiado a usar un solo <src> con una ruta y entonces un conjunto de <include> elementos, como este:

<src path="${src.dir}" /> 
<include name="com/foo/bar/baz/**" /> 
<include name="com/foo/bar/quux/**" /> 

Esto parece ser funcionalmente idéntica, pero es compatible con el uso de <exclude>:

<exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/> 

(De hecho, me sorprende que lo que estaba allí en el primer lugar funcionó en absoluto.)

+0

¡Eso parece más familiar! – trashgod

4

Trate

<javac> 
(...> 
<exclude name="${src.dir}/com/foo/bar/quux/dontwant/*" /> 
(...) 
</javac> 
+1

No, eso no funciona. Todavía intenta compilar esos archivos. –

+1

+1 para la idea correcta original. – trashgod

5

no estoy seguro sobre el resto, pero el elemento anidado <exclude/> debe trabajar en la tarea Javac. Vea el sexto example abajo.

Addendum: Los patrones, incluida la notación **, se tratan en Directory-based Tasks.

<target name="compile.baz" depends="init"> 
    <javac destdir="${build.dir}/classes" debug="on"> 
     <compilerarg value="-Xlint:deprecation"/> 
     <src> 
      <pathelement location="${src.dir}/com/foo/bar/baz/" /> 
      <pathelement location="${src.dir}/com/foo/bar/quux/" /> 
     </src> 
     <exclude name="${src.dir}/com/foo/bar/quux/dontwant/**"/> 
     ... 
    </javac> 
    ... 
</target> 
+0

Aparte del '' 'adicional, eso es lo mismo que dijo matiasf. Solo para asegurarme de que lo intenté de todos modos, pero no funciona. El ejemplo con el que se vinculó me ayudó a descubrir algo que funciona, sin embargo. –

+0

Sí, +1 a @matiasf. También quería mostrar que '' está anidado en 'javac', pero no en' '. Agregué un enlace a la sección en '**', porque nunca puedo encontrarlo cuando lo necesito. :-) – trashgod

1

tratar carpeta de "prueba" bajo {source.dir} no sería cumplido

<javac destdir="${compile.dir}" ...> 
    <src path="${source.dir}" /> 
    <exclude name="test/**"/> 
</javac> 
10

De mis experimentos no se debe incluir ruta completa para el archivo que desea excluir. Éste no funciona:

<javac> 
(...> 
    <exclude name="${src.dir}/com/foo/blah/blah1/FILENAME.java"/> 
(...) 
</javac> 

pero éste hace:

<javac> 
(...> 
    <exclude name="com/foo/blah/blah1/FILENAME.java"/> 
(...) 
</javac> 
4

Si usted está tratando de excluir a las clases de Java, pero la hormiga todavía está tratando de recopilar ellos pueden deberse a referencias a estas clases en su código.

Si A.java tiene una referencia a B.java e intenta excluir a B.java, compilar A.java requerirá que también se compile B.java.

Este es uno de los motivos de las interfaces en Java, por lo que puede compilar la interfaz sin necesidad de compilar las implementaciones.

Cuestiones relacionadas