Ant Cheat Sheet¶
Panoramica¶
Apache Ant è uno strumento di build basato su Java che utilizza XML per descrivere il processo di build e le sue dipendenze. È indipendente dalla piattaforma e progettato per essere estensibile attraverso classi Java.
Would you like me to continue with the remaining sections? Please provide the specific text for each section you want translated.```bash
macOS¶
brew install ant
Ubuntu/Debian¶
sudo apt install ant
CentOS/RHEL¶
sudo yum install ant
Windows (Chocolatey)¶
choco install ant
Manual installation¶
wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.12-bin.tar.gz tar -xzf apache-ant-1.10.12-bin.tar.gz export ANT_HOME=/path/to/apache-ant-1.10.12 export PATH=\(PATH:\)ANT_HOME/bin
Basic Concepts¶
Key Terms¶
Build File # XML file (usually build.xml)
Project # Root element of build file
Target # Set of tasks to execute
Task # Unit of work (compile, copy, etc.)
Property # Name-value pair for configuration
Project Structure¶
project/
├── build.xml
├── src/
│ ├── main/
│ │ └── java/
│ └── test/
│ └── java/
├── lib/
├── build/
└── dist/
Basic build.xml¶
Minimal Example¶
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="compile" basedir=".">
<description>A simple Java project</description>
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="$\\\\{build.dir\\\\}/classes"/>
<target name="init">
<mkdir dir="$\\\\{build.dir\\\\}"/>
<mkdir dir="$\\\\{classes.dir\\\\}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="$\\\\{src.dir\\\\}" destdir="$\\\\{classes.dir\\\\}"/>
</target>
<target name="clean">
<delete dir="$\\\\{build.dir\\\\}"/>
</target>
</project>
Complete Example¶
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="build" basedir=".">
<description>Complete Java project build file</description>
<property name="src.dir" value="src/main/java"/>
<property name="test.src.dir" value="src/test/java"/>
<property name="resources.dir" value="src/main/resources"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="$\\\\{build.dir\\\\}/classes"/>
<property name="test.classes.dir" value="$\\\\{build.dir\\\\}/test-classes"/>
<property name="dist.dir" value="dist"/>
<property name="jar.file" value="$\\\\{dist.dir\\\\}/$\\\\{ant.project.name\\\\}.jar"/>
<path id="classpath">
<fileset dir="$\\\\{lib.dir\\\\}">
<include name="*.jar"/>
</fileset>
</path>
<path id="test.classpath">
<path refid="classpath"/>
<pathelement location="$\\\\{classes.dir\\\\}"/>
<pathelement location="$\\\\{test.classes.dir\\\\}"/>
</path>
<target name="init">
<mkdir dir="$\\\\{build.dir\\\\}"/>
<mkdir dir="$\\\\{classes.dir\\\\}"/>
<mkdir dir="$\\\\{test.classes.dir\\\\}"/>
<mkdir dir="$\\\\{dist.dir\\\\}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="$\\\\{src.dir\\\\}"
destdir="$\\\\{classes.dir\\\\}"
classpathref="classpath"
debug="true"
includeantruntime="false"/>
<copy todir="$\\\\{classes.dir\\\\}">
<fileset dir="$\\\\{resources.dir\\\\}"/>
</copy>
</target>
<target name="compile-tests" depends="compile">
<javac srcdir="$\\\\{test.src.dir\\\\}"
destdir="$\\\\{test.classes.dir\\\\}"
classpathref="test.classpath"
debug="true"
includeantruntime="false"/>
</target>
<target name="test" depends="compile-tests">
<junit printsummary="yes" haltonfailure="yes">
<classpath refid="test.classpath"/>
<formatter type="plain"/>
<batchtest fork="yes" todir="$\\\\{build.dir\\\\}">
<fileset dir="$\\\\{test.src.dir\\\\}">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
</junit>
</target>
<target name="jar" depends="compile">
<jar destfile="$\\\\{jar.file\\\\}" basedir="$\\\\{classes.dir\\\\}">
<manifest>
<attribute name="Main-Class" value="com.example.Main"/>
<attribute name="Class-Path" value=". lib/"/>
</manifest>
</jar>
</target>
<target name="build" depends="test,jar"/>
<target name="clean">
<delete dir="$\\\\{build.dir\\\\}"/>
<delete dir="$\\\\{dist.dir\\\\}"/>
</target>
<target name="rebuild" depends="clean,build"/>
</project>
Properties¶
Property Definition¶
<property name="version" value="1.0.0"/>
<property name="src.dir" value="src"/>
<property file="build.properties"/>
<property environment="env"/>
<echo message="Java Home: $\\\\{env.JAVA_HOME\\\\}"/>
<property name="java.version" value="$\\\\{java.version\\\\}"/>
<condition property="isWindows">
<os family="windows"/>
</condition>
<property name="build.type" value="debug"/>
Property Files¶
# build.properties
version=1.0.0
src.dir=src/main/java
test.dir=src/test/java
lib.dir=lib
build.dir=build
Tasks¶
File Operations¶
<copy todir="$\\\\{build.dir\\\\}/resources">
<fileset dir="$\\\\{src.dir\\\\}/resources"/>
</copy>
<copy todir="$\\\\{build.dir\\\\}/config" filtering="true">
<fileset dir="config"/>
<filterset>
<filter token="VERSION" value="$\\\\{version\\\\}"/>
<filter token="BUILD_DATE" value="$\\\\{timestamp\\\\}"/>
</filterset>
</copy>
<move todir="$\\\\{backup.dir\\\\}">
<fileset dir="$\\\\{build.dir\\\\}">
<include name="*.log"/>
</fileset>
</move>
<delete dir="$\\\\{build.dir\\\\}"/>
<delete>
<fileset dir="." includes="**/*.tmp"/>
</delete>
<mkdir dir="$\\\\{build.dir\\\\}/classes"/>
<zip destfile="$\\\\{dist.dir\\\\}/source.zip">
<fileset dir="$\\\\{src.dir\\\\}"/>
</zip>
<tar destfile="$\\\\{dist.dir\\\\}/source.tar.gz" compression="gzip">
<fileset dir="$\\\\{src.dir\\\\}"/>
</tar>
Compilation Tasks¶
<javac srcdir="$\\\\{src.dir\\\\}"
destdir="$\\\\{classes.dir\\\\}"
classpathref="classpath"
debug="true"
deprecation="true"
optimize="false"
includeantruntime="false">
<include name="**/*.java"/>
<exclude name="**/Test*.java"/>
</javac>
<jar destfile="$\\\\{dist.dir\\\\}/myapp.jar"
basedir="$\\\\{classes.dir\\\\}"
includes="**/*.class">
<manifest>
<attribute name="Main-Class" value="com.example.Main"/>
<attribute name="Implementation-Version" value="$\\\\{version\\\\}"/>
<attribute name="Built-By" value="$\\\\{user.name\\\\}"/>
<attribute name="Built-Date" value="$\\\\{timestamp\\\\}"/>
</manifest>
</jar>
<war destfile="$\\\\{dist.dir\\\\}/myapp.war" webxml="web.xml">
<fileset dir="webapp"/>
<lib dir="lib"/>
<classes dir="$\\\\{classes.dir\\\\}"/>
</war>
Testing Tasks¶
<junit printsummary="yes"
haltonfailure="yes"
haltonerror="yes"
fork="yes">
<classpath refid="test.classpath"/>
<formatter type="plain"/>
<formatter type="xml"/>
<test name="com.example.MyTest" todir="$\\\\{test.reports.dir\\\\}"/>
<batchtest fork="yes" todir="$\\\\{test.reports.dir\\\\}">
<fileset dir="$\\\\{test.src.dir\\\\}">
<include name="**/*Test.java"/>
<exclude name="**/Abstract*Test.java"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="$\\\\{test.reports.dir\\\\}">
<fileset dir="$\\\\{test.reports.dir\\\\}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="$\\\\{test.reports.dir\\\\}/html"/>
</junitreport>
Targets and Dependencies¶
Target Dependencies¶
<target name="compile" depends="init">
</target>
<target name="build" depends="clean,compile,test,jar">
</target>
<target name="compile-debug" if="debug.enabled">
<javac srcdir="$\\\\{src.dir\\\\}" destdir="$\\\\{classes.dir\\\\}" debug="true"/>
</target>
<target name="compile-release" unless="debug.enabled">
<javac srcdir="$\\\\{src.dir\\\\}" destdir="$\\\\{classes.dir\\\\}" optimize="true"/>
</target>
<target name="help" description="Show available targets">
<echo message="Available targets:"/>
<echo message=" compile - Compile source code"/>
<echo message=" test - Run unit tests"/>
<echo message=" jar - Create JAR file"/>
<echo message=" clean - Clean build directory"/>
</target>
Conditional Execution¶
<target name="check-java-version">
<condition property="java.version.ok">
<or>
<contains string="$\\\\{java.version\\\\}" substring="1.8"/>
<contains string="$\\\\{java.version\\\\}" substring="11"/>
<contains string="$\\\\{java.version\\\\}" substring="17"/>
</or>
</condition>
<fail unless="java.version.ok"
message="Java 8, 11, or 17 required. Found: $\\\\{java.version\\\\}"/>
</target>
<target name="init-windows" if="isWindows">
<property name="script.ext" value=".bat"/>
</target>
<target name="init-unix" unless="isWindows">
<property name="script.ext" value=".sh"/>
</target>
Macros and Custom Tasks¶
Macrodefs¶
<macrodef name="compile-module">
<attribute name="module"/>
``<attribute name="srcdir" default="src/@\\\{module\\\}/java"/>``
``<attribute name="destdir" default="build/@\\\{module\\\}/classes"/>``
<sequential>
``<mkdir dir="@\\\{destdir\\\}"/>``
``<javac srcdir="@\\\{srcdir\\\}"
destdir="@\\\{destdir\\\}"
classpathref="classpath"
includeantruntime="false"/>``
</sequential>
</macrodef>
<target name="compile-all">
<compile-module module="core"/>
<compile-module module="web"/>
<compile-module module="api"/>
</target>
<macrodef name="run-tests">
<attribute name="module"/>
<element name="test-elements" implicit="true"/>
<sequential>
<junit printsummary="yes" haltonfailure="yes">
``<classpath refid="test.classpath.@\\\{module\\\}"/>``
<test-elements/>
</junit>
</sequential>
</macrodef>
Custom Tasks¶
<taskdef name="mytask" classname="com.example.MyTask">
<classpath>
<pathelement location="lib/custom-tasks.jar"/>
</classpath>
</taskdef>
<target name="custom-operation">
<mytask param1="value1" param2="value2"/>
</target>
Advanced Features¶
Parallel Execution¶
<target name="build-parallel">
<parallel>
<sequential>
<antcall target="compile-core"/>
<antcall target="test-core"/>
</sequential>
<sequential>
<antcall target="compile-web"/>
<antcall target="test-web"/>
</sequential>
</parallel>
</target>
Subprojects¶
<target name="build-all">
<subant target="build">
<fileset dir="." includes="*/build.xml"/>
</subant>
</target>
<target name="clean-all">
<ant dir="core" target="clean"/>
<ant dir="web" target="clean"/>
<ant dir="api" target="clean"/>
</target>
Import and Include¶
<import file="common-build.xml"/>
<include file="properties.xml"/>
<import file="base-build.xml"/>
<target name="compile" depends="base.compile">
<echo message="Custom compilation step"/>
</target>
Command Line Usage¶
Basic Commands¶
# Run default target
ant
# Run specific target
ant compile
ant clean
ant test
# Run multiple targets
ant clean compile test
# List available targets
ant -projecthelp
ant -p
# Verbose output
ant -verbose compile
ant -v compile
# Debug output
ant -debug compile
ant -d compile
# Quiet output
ant -quiet compile
ant -q compile
Setting Properties¶
```bash
Set properties from command line¶
ant -Dversion=2.0.0 -Ddebug.enabled=true compile
Use different build file¶
ant -buildfile mybuild.xml compile ant -f mybuild.xml compile
Set logger¶
ant -logger org.apache.tools.ant.DefaultLogger compile
Find build file¶
ant -find build.xml compile
### Opzioni Avanzatebash
Keep going on failure¶
ant -keep-going build
Use input handler¶
ant -inputhandler org.apache.tools.ant.input.DefaultInputHandler
Set log level¶
ant -loglevel info compile
Disable input¶
ant -noinput compile
Show version¶
ant -version
## Integrazionexml
<replace file=".classpath" token="@PROJECT_NAME@" value="$\\\{ant.project.name\\\}"/>
### Integrazione IDExml
### Integrazione CI/CDxml
### Controllo Versionexml
## Migliori Pratichexml
### Organizzazione Progettobash
Check Ant installation¶
ant -version
Verify Java installation¶
java -version
Check classpath issues¶
ant -debug compile 2>&1|grep -i classpath
Validate build file¶
ant -projecthelp
Check property values¶
ant -Dant.echo.properties=true compile
### Gestione degli Errorixml
## Risoluzione dei Problemixml
Tecniche di Debug¶
https://ant.apache.org/manual/##
Suggerimenti sulle Prestazioni¶
https://ant.apache.org/manual/tasksoverview.html#
Risorse¶
https://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html- Documentazione Ufficiale: [ant.apache.org](