Pregunta

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

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

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

Ahora, ¿cómo puedes hacer eso con la hormiga?la hormiga javac tarea compila todo:

El directorio de origen y de destino se escaneará recursivamente para que los archivos de origen Java se compilen.

Uno puede utilizar el excludes y includes parámetros, pero son problemáticos para este propósito.De hecho, parece que uno tiene que configurar explícitamente todos los includes (no búsqueda automática de dependencias), y aún peor eso excluye tiene prioridad sobre incluye:

Cuando se utilizan tanto la inclusión como la exclusión, solo los archivos/directorios que coinciden al menos uno de los patrones de inclusión y no coincidan cualquier de los patrones de exclusión 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" />  

Porque no compilará nada :-(

¿Hay alguna forma de lograr esa simple línea de comando? javac con hormiga?


EDITADO:Gracias por tu respuesta, Sadie, la acepto porque funciona de la manera que me preguntaba en esta pregunta.Pero tengo un par de comentarios (demasiado largos para estar en el campo de comentarios de tu respuesta):

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

2) Cuando simplemente includes hormiga registra algo como

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

incluso si las dependencias hacen que se compile (mucho) más de un solo archivo fuente.

¿Fue útil?

Solución

¿Por qué excluye además de incluir? Si tiene al menos una inclusión, los archivos solo se compilan si se incluyen explícitamente. Entonces esto debería funcionar:

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

O más flexiblemente:

<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 solo ciertos paquetes o clases en un jar, use un atributo de conjunto de archivos

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

Nuevamente, puede usar varias inclusiones para combinar paquetes separados. Experimente con incluye y lea la documentación y seguramente encontrará la respuesta que necesita.

Otros consejos

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

Según los documentos de la hormiga, el elemento <javac> es un <fileset> implícito y, como tal, puede tomar Selectores como <filename name="**/MyClass.java"/>, por lo que esto solo compilaría MyClass.java:

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

En realidad, la hormiga solo comprueba todo, si ejecuta una compilación dos veces seguidas, notará que la segunda es mucho más rápida. En realidad, se puede persuadir fácilmente para que pierda cosas.

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

Solo proporcione la lista de archivos separados por comas 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á.

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