2008-10-14 10 views
8

Digamos que tengo mis fuentes en mi src/tree (y posiblemente en mi prueba/árbol). Digamos que me gustaría compilar solo parte de ese árbol. Las razones por las que podría querer hacer eso son varias. Solo como ejemplo, podría querer crear el jar más pequeño posible (sin incluir ciertas clases), o podría querer el tiempo de compilación más rápido para lo que estoy compilando. ¡Sin embargo, absolutamente quiero compilar todas las dependencias!compilando solo parte del árbol fuente con ant

Esto se puede lograr fácilmente desde la línea de comandos:

javac -d build/ -cp whatever -sourcepath src src/path/to/MyClass.java 

Ahora, ¿cómo se puede hacer eso con la hormiga? La hormiga javac task compiles everything:

la fuente y el directorio de destino serán analizadas de forma recursiva para Java archivos de código fuente para compilar.

se pueden utilizar los parámetros excludes y includes, pero son problemáticos para este propósito. De hecho, parece que uno tiene que explícitamente configuración de todo el includes (no automática de búsqueda de la dependencia), y incluso peor que excludes has priority on includes:

Cuando tanto la inclusión y la exclusión son de segunda mano, sólo los archivos/directorios que coincide con al menos uno de los patrones incluidos y no coinciden con excluyendo los patrones se utilizan.

Por lo tanto, no se puede utilizar

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath" 
      excludes="**/*.java" includes="src/path/to/MyClass.java" /> 

Debido a que no se compilará nada :-(

¿Hay alguna manera de lograr que la línea de comandos sencilla javac con la hormiga?


EDITADO: Gracias por su respuesta, Sadie, la acepto, porque funciona de la forma en que me preguntaba en t su pregunta. Pero tengo un par de comentarios (demasiado tiempo para estar en el campo de comentarios de su respuesta):

1) Leí la documentación (vea los enlaces de arriba), pero no está claro que con solo includes usted también está excluyendo todo lo demás

2) cuando se acaba de includes registros de hormigas algo así como

[javac] Compiling 1 source file to /my/path/to/build 

incluso si las dependencias hacen que la compilación (mucho) más de un archivo de origen.

+0

Si desea crear un JAR más pequeño, hágalo en la tarea ; tiene todos los atributos necesarios. Si quieres el tiempo de compilación más rápido ... bueno, la compilación en Java siempre lleva solo unos segundos, no veo cómo podrías ganar mucho aquí. ¡Enfócate en algo más útil! –

+0

Depende de qué tan grande es tu proyecto. Me parece que cuando un proyecto supera las 600 o 700 clases, la compilación comienza a disminuir significativamente y tengo que tratar de dividirla de alguna manera. –

+2

@Vladimir Dyuzhev - eso no responde la pregunta del OP. – talonx

Respuesta

12

¿Por qué se excluyen y se incluyen? Si tiene al menos una inclusión, los archivos solo se compilan si están incluidos explícitamente. Así que esto debería funcionar:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath" 
     includes="src/path/to/MyClass.java" /> 

O de forma más flexible:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"> 
    <include name="src/path/to/MyClass.java"/> 
    <include name="src/path/to/AnotherClass.java"/> 
</javac> 

para incluir sólo determinados paquetes o clases en un frasco, utilizar un atributo conjunto de archivos

<jar jarfile="${outlib}/something.jar"> 
    <fileset dir="${build.dir}"> 
     <include name='src/path/to/classes' /> 
    </fileset> 
</jar> 

Una vez más, se puede utilizar multiple incluye combinar paquetes separados. Experimente con includes y read the documentation y de seguro encontrará la respuesta que necesita.

+0

por favor vea mi comentario completo en la pregunta anterior – Davide

0

En realidad, solo comprueba todo, si ejecuta una compilación dos veces seguidas, notará que la segunda es mucho más rápida. En realidad, puede persuadirse fácilmente de extrañar cosas.

Si ni siquiera quiere que considere todo, tendrá que dividirlo en módulos/proyectos/árboles fuente más pequeños para que le explique explícitamente qué compilar.

0

Simplemente presente solo la lista separada por comas de los archivos que desea compilar. Digamos ejemplo

<property name="includeFileList" value="<name of java class>.java"/> 

<javac srcdir="${src.dir}" destdir="${build.dir}" 
     target="1.6" debug="true" includes="${includeFileList}"/> 

Funcionará.

2

Una vieja pregunta, pero estaba luchando con el mismo problema y encontré una solución más elegante. Así que aquí está, para futuras referencias:

De acuerdo con los documentos de hormigas el elemento <javac> es una implícita <fileset> y como tal puede tener como Selectors<filename name="**/MyClass.java"/>, así que esto sólo sería compilar MyClass.java:

<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="classpath"> 
    <filename name="**/path/to/MyClass.java"/> 
</javac> 
Cuestiones relacionadas