A student at the robotics program I mentor emailed me the following question. Since it isn’t specific to him, I decided to answer in a blog post.
As a developer, what tools does Java have to help me manage things like dependencies and building the project? For example, Python has pip and Ruby has gem+bundler, for managing dependencies.
Can you extol the virtues of Maven and ant? Why should I use one over the other? My research leads me to believe Maven supersedes ant. Are there any other alternatives? And if you prefer one, what makes it valuable to you?
Ant and Maven are the most common build tools in the Java world. I’ve used both. Gradle is a third that I’ve heard a lot about. I haven’t used Gradle, but it looks cool. The benefits of Maven, but the Groovy language. Maven and Gradle are actually both a build and dependency tool. Ant is just a build tool. You can use Ant without any dependency management tool/repository. Or you can use Artifactory or Ivy with Ant.
Maven came after Ant, but didn’t supersede Ant. Both have their purposes. We use Ant at CodeRanch to:
- Build the forum software
- Generate the book promotion documents every week
Ant serves these purposes very well to this day. The latest release of Ant was in the past 6 months; it is far from a dead project. The strengths of Ant include:
- Ant works better when internet availability is unpredictable or very slow. With Ant, you have complete control over when and which jars are downloaded. (To be fair, you can work with Maven in offline mode once you have the jars locally. But there are a lot more dependencies and therefore more to download.)
- Ant works better when you don’t want to do things “the Maven way.” Maven uses convention over configuration. Which is great when you can use those conventions. They save a lot of time. (And most of those conventions are fine). It so happens at CodeRanch, we don’t deploy a full war. We deploy a zip file containing a subset of the project files. Again because of that internet thing. We don’t all have the ability to upload a full war without the internet connection timing out. This could be done in Maven, but it would be odd. And I think it would be confusing to use Maven and ignore conventions.
- Ant gives you complete control.
Maven has a different set of advantages
- It is much faster to get started with a new project. You can use an “archetype” to get a project template.
- You don’t have to think about dependencies. If you are using X and it depends on Y, both get pulled. The dependency management is excellent.
- Convention means you don’t have to set up much in your build configuration.
I think Maven is going to be better for the project I was asked about here. You want dependency management which is something Maven excels at. And you have a greenfield project which means there is no reason you can’t use Maven’s conventions. Also, many other tools easily integrate with Maven (or Ant) like Findbugs which will be helpful.
Small typo: “Ant is just a dependency tool.” should be “build tool”.
Fixed, thanks. It’s hard to call that a typo. It’s more of an “error between fingers and brain” type thing.