Saltar a contenido

Hoja de Referencia de Apache Ant

Instalación

Platform Comando
Ubuntu/Debian sudo apt update && sudo apt install ant
RHEL/CentOS/Fedora sudo yum install ant or sudo dnf install ant
Arch Linux sudo pacman -S apache-ant
macOS (Homebrew) brew install ant
Windows (Chocolatey) choco install ant
Manual (All Platforms) Download from apache.org, extract, set ANT_HOME and add bin/ to PATH
Requisitos previos: Se requiere Java JDK 8+. Configurar
JAVA_HOMEvariable de entorno.

Comandos Básicos

Comando Descripción
ant -version Mostrar versión de Ant, versión de Java e información del sistema operativo
ant Ejecutar el objetivo predeterminado especificado en build.xml
ant compile Ejecute el objetivo "compile" desde build.xml
ant clean Ejecutar el objetivo "clean" (típicamente elimina artefactos de compilación)
ant -projecthelp Listar todos los objetivos disponibles con descripciones
ant -p Forma abreviada de -projecthelp
ant -f custom-build.xml Usar archivo de compilación alternativo en lugar de build.xml
ant -buildfile mybuild.xml compile Especificar archivo de compilación y destino para ejecutar
ant -verbose compile Mostrar información detallada de ejecución
ant -v test Forma abreviada de -verbose
ant -debug package Verbosidad máxima para solución de problemas
ant -d deploy Forma abreviada de -debug
ant -quiet test Salida mínima, mostrar solo errores
ant -q build Forma abreviada de -quiet
ant -logfile build.log compile Redirigir la salida al archivo de registro especificado
ant -l output.log test Forma abreviada de -logfile
## Uso Avanzado
Comando Descripción
ant -Denv=production deploy Establecer valor de propiedad en línea de comandos
ant -Dversion=1.2.3 -Dbuild.number=456 package Establecer múltiples propiedades
ant -propertyfile custom.properties build Cargar propiedades desde archivo externo
ant -find Buscar directorios padre para build.xml
ant -s Forma abreviada de -find
ant -keep-going test Continuar ejecutando objetivos independientes después del fallo
ant -k test Forma abreviada de -keep-going
ant -diagnostics Mostrar información del sistema y detalles de configuración
ant -listener org.apache.tools.ant.listener.Log4jListener compile Agregar detector de eventos de compilación personalizado
ant -logger org.apache.tools.ant.NoBannerLogger compile Usar implementación de logger personalizado
ant -inputhandler org.apache.tools.ant.input.SecureInputHandler deploy Usar manejador de entrada personalizado para entrada segura
ant -noclasspath compile Ignorar variable de entorno CLASSPATH
ant -autoproxy download Configurar automáticamente los ajustes de proxy de Java
ant -lib /path/to/jars compile Agregar directorio de JARs a la classpath de Ant
ant -Dant.executor.class=org.apache.tools.ant.helper.ParallelExecutor build Habilitar la ejecución de tareas en paralelo
ant compile test package Ejecutar múltiples objetivos en secuencia
ant -Dskip.tests=true package Omitir tareas condicionalmente según una propiedad
## Configuración

Estructura Básica de build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="build" basedir=".">

    <!-- Properties -->
    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build"/>
    <property name="dist.dir" value="dist"/>
    <property name="lib.dir" value="lib"/>

    <!-- Classpath -->
    <path id="classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <!-- Clean target -->
    <target name="clean" description="Remove build artifacts">
        <delete dir="${build.dir}"/>
        <delete dir="${dist.dir}"/>
    </target>

    <!-- Init target -->
    <target name="init" depends="clean">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
    </target>

    <!-- Compile target -->
    <target name="compile" depends="init" description="Compile source code">
        <javac srcdir="${src.dir}" 
               destdir="${build.dir}"
               classpathref="classpath"
               includeantruntime="false"
               debug="true"
               source="11"
               target="11"/>
    </target>

    <!-- Build target -->
    <target name="build" depends="compile" description="Build JAR file">
        <jar destfile="${dist.dir}/${ant.project.name}.jar" 
             basedir="${build.dir}">
            <manifest>
                <attribute name="Main-Class" value="com.example.Main"/>
            </manifest>
        </jar>
    </target>

</project>

Archivo build.properties

# Project configuration
project.name=MyApplication
project.version=1.0.0

# Directory structure
src.dir=src/main/java
test.dir=src/test/java
resources.dir=src/main/resources
build.dir=target/classes
dist.dir=dist

# Compiler settings
java.source.version=11
java.target.version=11
javac.debug=true
javac.deprecation=true

# Dependencies
lib.dir=lib

Cargando Propiedades en build.xml

<property file="build.properties"/>
<property file="build-${env}.properties"/>
<property environment="env"/>

Conjuntos de Archivos y Patrones Comunes

<!-- Include all Java files -->
<fileset dir="${src.dir}" includes="**/*.java"/>

<!-- Exclude test files -->
<fileset dir="${src.dir}">
    <include name="**/*.java"/>
    <exclude name="**/*Test.java"/>
</fileset>

<!-- Pattern sets for reuse -->
<patternset id="source.patterns">
    <include name="**/*.java"/>
    <include name="**/*.properties"/>
    <exclude name="**/*Test.java"/>
</patternset>

Casos de Uso Comunes

Caso de Uso: Compilación Completa de Aplicación Java

# Clean previous builds
ant clean

# Compile, test, and package in one command
ant compile test package

# Build with specific environment properties
ant -Denv=production -propertyfile prod.properties package

# Create distribution with documentation
ant clean compile test package javadoc dist

Objetivos de build.xml:

<target name="test" depends="compile">
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <path refid="classpath"/>
            <pathelement location="${build.dir}"/>
        </classpath>
        <batchtest fork="yes">
            <fileset dir="${test.dir}">
                <include name="**/*Test.java"/>
            </fileset>
        </batchtest>
    </junit>
</target>

<target name="javadoc">
    <javadoc sourcepath="${src.dir}" 
             destdir="${dist.dir}/docs"
             packagenames="com.example.*"/>
</target>

Caso de Uso: Creación de Archivo WAR para Aplicación Web

# Build and package web application
ant clean compile war

# Deploy to application server
ant -Dserver.path=/opt/tomcat/webapps deploy

Configuración de build.xml:

<target name="war" depends="compile">
    <war destfile="${dist.dir}/${project.name}.war" 
         webxml="web/WEB-INF/web.xml">
        <classes dir="${build.dir}"/>
        <lib dir="${lib.dir}"/>
        <fileset dir="web">
            <include name="**/*.jsp"/>
            <include name="**/*.html"/>
            <include name="**/*.css"/>
            <include name="**/*.js"/>
        </fileset>
    </war>
</target>

<target name="deploy" depends="war">
    <copy file="${dist.dir}/${project.name}.war" 
          todir="${server.path}"/>
</target>

Caso de Uso: Compilación de Proyecto Multi-Módulo

# Build all modules in parallel
ant -Dant.executor.class=org.apache.tools.ant.helper.ParallelExecutor build-all

# Build specific module
ant -Dmodule=core build-module

# Build and run integration tests
ant build-all integration-test

build.xml con subproyectos:

<target name="build-all">
    <subant target="build">
        <fileset dir="." includes="*/build.xml"/>
    </subant>
</target>

<target name="build-module">
    <ant dir="${module}" target="build" inheritAll="false"/>
</target>

Caso de Uso: Compilaciones Condicionales con Verificación de Propiedades

# Skip tests during build
ant -Dskip.tests=true package

# Build only if sources changed
ant -Dincremental=true compile

# Production build with optimizations
ant -Doptimize=true -Ddebug=false production-build

build.xml con condiciones:

<target name="compile">
    <javac srcdir="${src.dir}" 
           destdir="${build.dir}"
           debug="${debug}"
           optimize="${optimize}">
        <classpath refid="classpath"/>
    </javac>
</target>

<target name="test" unless="skip.tests">
    <junit printsummary="yes">
        <classpath>
            <path refid="classpath"/>
            <pathelement location="${build.dir}"/>
        </classpath>
        <batchtest>
            <fileset dir="${test.dir}" includes="**/*Test.java"/>
        </batchtest>
    </junit>
</target>

<target name="package" depends="compile,test">
    <jar destfile="${dist.dir}/${ant.project.name}.jar" 
         basedir="${build.dir}"/>
</target>

Caso de Uso: Migración y Despliegue de Base de Datos

# Run database migrations
ant -propertyfile db-config.properties db-migrate

# Deploy application with database updates
ant -Denv=staging db-migrate deploy

# Rollback database changes
ant -Dversion=1.2.0 db-rollback

build.xml con tareas SQL:

<target name="db-migrate">
    <sql driver="${db.driver}"
         url="${db.url}"
         userid="${db.user}"
         password="${db.password}"
         src="migrations/migrate-${version}.sql"
         print="yes"
         output="migration.log"/>
</target>

<target name="db-rollback">
    <sql driver="${db.driver}"
         url="${db.url}"
         userid="${db.user}"
         password="${db.password}"
         src="migrations/rollback-${version}.sql"/>
</target>

Mejores Prácticas

  • Usar archivos de propiedades para configuración: Separar configuraciones específicas del entorno de la lógica de compilación. Cargar propiedades con <property file="build.properties"/> to keep build.xml clean and reusable.

  • Define meaningful target descriptions: Add descripción attributes to public targets for better ant -ayuda-proyecto output. This serves as built-in documentation for your build process.

  • Leverage target dependencies: Use depende attribute to establish build order and avoid redundant task execution. Ant automatically handles dependency resolution.

  • Set includeantruntime="false" in javac tasks: Prevents Ant runtime libraries from polluting your application classpath, avoiding potential conflicts and reducing JAR size.

  • Use filesets and pattern sets for flexibility: Define reusable file patterns with <patternset> and reference them in multiple targets. This makes maintenance easier and reduces duplication.

  • Implement incremental builds: Use <uptodate> conditions to skip compilation when source files haven't changed, significantly speeding up development builds.

  • Version control your build files: Include build.xml, property files, and custom tasks in version control. Exclude generated directories like build/ and dist/ using .gitignore.

  • Use macros for repeated task sequences: Define <macrodef> elements for common operations performed across multiple modules or targets, promoting DRY principles.

  • Separate concerns with imported build files: Split large build files into logical components (common-build.xml, test-build.xml) e importarlos para mejorar la mantenibilidad.

  • Documentar la lógica compleja con comentarios: Usar comentarios XML para explicar la lógica de construcción, uso de propiedades y dependencias que no son obvias, especialmente en proyectos compartidos o heredados.

Resolución de problemas

Problema Solución
BUILD FAILED: build.xml does not exist Run ant -find to search parent directories, or specify file with ant -f path/to/build.xml
Unable to locate tools.jar Set JAVA_HOME to JDK (not JRE) directory. Verify with echo $JAVA_HOME and ensure it points to JDK installation
ClassNotFoundException for custom tasks Add JAR to Ant's classpath using -lib option: ant -lib /path/to/jars compile or use <taskdef> with correct classpath
Compilation fails with encoding errors Add encoding="UTF-8" attribute to <javac> task: <javac srcdir="${src.dir}" encoding="UTF-8"/>
Out of memory during build Increase heap size: export ANT_OPTS="-Xmx1024m -Xms512m" (Linux/Mac) or set ANT_OPTS=-Xmx1024m (Windows)
Target not found error Verify target name with ant -projecthelp. Check for typos and ensure target is defined in active build file
Circular dependency detected Review depends attributes in targets. Ant cannot resolve circular references - redesign target dependencies
Permission denied when writing files Verifique los permisos del directorio y asegúrese de que Ant tenga acceso de escritura. Ejecute con privilegios de usuario apropiados o ajuste la propiedad del directorio
fork="true" required but task fails Some tasks (junit, java) require forking. Ensure fork="true" is set and JAVA_HOME points to valid JDK
Properties not being overridden Properties are immutable in Ant - first definition wins. Set properties via command line (-D) before build file loads them
Slow builds with large filesets Use <uptodate> conditions for incremental builds. Enable parallel execution with -Dant.executor.class=org.apache.tools.ant.helper.ParallelExecutor
JAR file manifest not correct Use <manifest> element within <jar> task to specify Main-Class and other attributes explicitly
## Referencia de Tareas Comunes de Ant
Tarea Descripción Ejemplo
<javac> Compilar archivos de origen Java <javac srcdir="src" destdir="build" includeantruntime="false"/>
<jar> Crear archivo JAR <jar destfile="dist/app.jar" basedir="build"/>
<war> Crear archivo WAR <war destfile="dist/app.war" webxml="web/WEB-INF/web.xml"/>
<copy> Copiar archivos o directorios <copy todir="backup"><fileset dir="src"/></copy>
<delete> Eliminar archivos o directorios <delete dir="build"/>
<mkdir> Crear directorio <mkdir dir="dist"/>
<echo> Imprimir mensaje <echo message="Building version ${version}"/>
<exec> Ejecutar comando del sistema <exec executable="git" args="rev-parse HEAD"/>
<junit> Ejecutar pruebas JUnit <junit printsummary="yes" fork="yes"/>
<zip> Crear archivo ZIP <zip destfile="dist/src.zip" basedir="src"/>
<sql> Ejecutar declaraciones SQL <sql driver="${db.driver}" url="${db.url}" src="schema.sql"/>