I've been trying to understand what Ant is used for but i still don't get it.
Can someone give me one use case for which Ant is used for, something I can try to see why Ant is useful and what kind of things I can use it for?
I do Java development in Eclipse and I'm just getting started with servlets and Google Web Toolkit.
Ant is a build tool. Say for example you have several projects in your Eclipse workspace, all of which are pieces of a larger application. To build it all into a jar file with dependencies included, you could select all the projects and export them as a jar file, but that's somewhat cumbersome.
Ant is an extensible solution. You define the build process in XML, and ant compiles your java files according to this recipe.
Ant can do more than building, too. I worked at a company where the mechanism for deployment was Debian packages in our own repository. We had Ant scripts that would build the jar files, arrange them and some metadata files into a Debian package, put them into the repository, and re-generate the repository manifest.
As with anything Java, there's a lot of configuration you need to get your head around before you're proficient with Ant, but some of the basic tutorials should give you an idea of what you're getting yourself into.
Ant is used, as any build tool is, to automate the repetitive tasks of building your code.
Rather than run javac each time by hand you put a command into an Ant script and then when you run ant it will run javac for you.
My typical build process with ant goes something like this:
- run javac on the source
- run javac on the tets
- run the cobertura instrumentation on the source (this is for code coverage)
- jar up the classes from the source
- jar up the cobertura instrumented classes
- jar up the unit test classes
- run checkstyle, pmd, findbugs on the source to find warnings
- run the unit tests via cobertura to get code coverage of them
So that is 8 steps that I have done on each build that I can do simply by running "ant".
Ant is an XML-based make file.
You won't see much benefit using Ant if you're a single developer who already builds and packages code successfully using an IDE like Eclipse.
The larger benefit comes when you have a team collaborating on code. Then you'll get a big boost if you use Cruise Control or some other continuous integration facility. CC requires an Ant build.xml.
This is from the ANT documentation and explains it pretty well.
Why another build tool when there is
already make, gnumake, nmake, jam, and
others? Because all those tools have
limitations that Ant's original author
couldn't live with when developing
software across multiple platforms.
Make-like tools are inherently
shell-based: they evaluate a set of
dependencies, then execute commands
not unlike what you would issue on a
shell. This means that you can easily
extend these tools by using or writing
any program for the OS that you are
working on; however, this also means
that you limit yourself to the OS, or
at least the OS type, such as Unix,
that you are working on.
Makefiles are inherently evil as well.
Anybody who has worked on them for any
time has run into the dreaded tab
problem. "Is my command not executing
because I have a space in front of my
tab?!!" said the original author of
Ant way too many times. Tools like Jam
took care of this to a great degree,
but still have yet another format to
use and remember.
Ant is different. Instead of a model
where it is extended with shell-based
commands, Ant is extended using Java
classes. Instead of writing shell
commands, the configuration files are
XML-based, calling out a target tree
where various tasks get executed. Each
task is run by an object that
implements a particular Task
interface.
Granted, this removes some of the
expressive power that is inherent in
being able to construct a shell
command such as find . -name foo
-exec rm {}
, but it gives you the ability to be cross-platform--to work
anywhere and everywhere. And hey, if
you really need to execute a shell
command, Ant has an task that
allows different commands to be
executed based on the OS it is
executing on.