Created at:
Modified at:
Ant notes
Basics
(2015-10-29)
Apache Ant is a build system built on the top of Java and it was made to as a replacement of "make".
Differences from make
The main difference from make
is that, while make uses a target-dependency
concept and shell commands to use dependencies to create targets, described in
a Makefile
, Ant uses a file called build.xml
with rules written in
XML. It also has the target concept, but uses it in a different way.
One reason on why people prefer Ant is that it doesn't depend on shell commands, which are easy to be unportable. All rules in Ant are in XML and Ant implements all tags internally.
Why is no one using make for java - Stack Overflow
Structure of build.xml
A very basic build.xml
file looks like this:
Apache Ant Manual - Using Apache Ant
<project name="MyProject" default="dist" basedir=".">
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<!-- Configure the CLASSPATH -->
<path id="MyClassPath">
<pathelement location="one_jar_file.jar"/>
<fileset dir="path_to_directory_containing_jar_files" includes="*.jar" />
</path>
<!-- Compiles project -->
<target name="compile">
<mkdir dir="${build}"/>
<javac srcdir="${src}" destdir="${build}" classpathref="MyClassPath"/>
</target>
<!-- Makes a jar file -->
<target name="dist" depends="compile">
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<!-- Clean everythin -->
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
The <javac>
tag is where all compilation is described. It calls the Java
compiler for *.java
files. Note that, although the tag is <javac>
,
other compiles other than javac
can be used, with the build.compiler
property.
Setting the target version of java in Ant - javac - Stack Overflow
Important parameters for the javac tag are:
- srcdir
- The top of your source directory. Normally it is the current one "
.
". - destdir
- Where destination
*.class
files are delivered. - encoding
- Encoding used in the project.
- classpathref
- The
$CLASSPATH
reference
Pay attention to the srcdir
dir parameter. It normally should point to
the **root directory** of your source tree, not indifividual package
directories. Ant does the job of finding Java files walkking down the
directory tree, unlike "make", you don't need to tell it the path of each file.
Other useful parameters are fork
, memoryinitialsize
and
memorymaximumsize
that are useful if you run into memory problems (see
below).
Troubleshooting
error Cannot run program ".../${aapt}": java.io.IOException: error=2, No such file or directory
Once, when compiling an Android program, I got an error like::
...build.xml:694: Execute failed: java.io.IOException: Cannot run program ".../${aapt}": java.io.IOException: error=2, No such file or directory
There seem to be different reasons for this problem. For some reason appt
could not be found. The solution I found Insert the aapt
location in
ant.properties
of the project I was editing file::
aapt=/path/to/aapt
The procedure is the same for any other executable.
error: package ... does not exist
(2015-10-29)
I set up srcdir
wrongly.
The system is out of resources.
... java.lang.OutOfMemoryError: Java heap space
(2015-10-29)
This happens because, in some situations, ant needs more memory. The compiler
needs more memory. For the javac
tag, configure the
memoryinitialsize
, memorymaximumsize
and fork
parameters, like::
<javac srcdir="${src}"
destdir="${classes}"
fork="true"
memoryinitialsize="512m"
memorymaximumsize="1024m" />
"java.lang.OutOfMemoryError: Java heap space" while generating reports - Stack Overflow
Build failed java.lang.OutOfMemoryError: Java heap space" - Stack Overflow