pathelement - build.xml java
compilando solo una parte del árbol fuente con la hormiga (4)
Digamos que tengo mis fuentes en mi src / tree (y posiblemente en mi prueba / árbol). Digamos que me gustaría compilar solo una 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!
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 tarea javac ant compila todo :
El directorio de origen y destino se analizará recursivamente para que los archivos fuente Java se compilen.
Uno puede usar las excludes
e includes
parámetros, pero son problemáticos para este propósito. De hecho, parece que uno tiene que configurar explícitamente todas las includes
(no la búsqueda de dependencia automática), e incluso lo peor que excluye tiene prioridad incluye :
Cuando se usan inclusión y exclusión, solo se utilizan archivos / directorios que coinciden con al menos uno de los patrones de inclusión y no coinciden con ninguno de los patrones de exclusión.
Por lo tanto, no puedes usar
<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 línea de comando simple javac
con hormiga?
EDITADO: Gracias por su respuesta, Sadie, lo estoy aceptando, porque funciona de la manera que me preguntaba en esta pregunta. Pero tengo un par de comentarios (demasiado tiempo para estar en el campo de comentarios de tu respuesta):
1) Leí la documentación (ver los enlaces más arriba), pero no está claro que con solo incluirlo también esté excluyendo todo lo demás
2) Cuando acaba de includes
registros de hormigas algo así como
[javac] Compiling 1 source file to /my/path/to/build
incluso si las dependencias lo hacen compilando (mucho) más que un solo archivo fuente.
En realidad, hormona solo verifica 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.
¿Por qué excluyes y también incluyes? Si tiene al menos una inclusión, los archivos solo se compilan si están incluidos 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 múltiples inclusiones para combinar paquetes separados. Experimente con incluye y lea la documentación y seguramente encontrará la respuesta que necesita.
Simplemente proporcione solo 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á.
Una vieja 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 ant, 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>