2. Java Build Tool Comparison
• Desired Features
• The Contenders
• Ant + Ivy
• Maven
• Gradle
• Buildr
• Others
• Results Matrix
• Subjective Evaluation
• Which Would You Choose?
3. Desired Features
• Dependency management
• Versioning
• Compile Java code, build jars
• Execute tests and report results, fail build on failed tests
• Run quality-check tools (PMD, Findbugs, Checkstyles)
• File generation (XmlBeans, Xsl, Velocity, AspectJ)
• Property expansion / token substitution
• Build vs. deploy vs. release
• Full control when needed
• Cross-platform
• IDE Support
• Documentation / Support
4. Ant + Ivy
Ant is ubiquitous Java-based build tool
Uses XML “script” files
Ivy is a dependency manager
Artifact repository
Dependency resolution, including transitive
(Project A -> Hibernate -> Commons-
Collections)
Sync with external repositories
6. Ant + Ivy
Add this to your Ant buildfile (build.xml)
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="pdk" default="default" basedir=".">
…
<!-- Ivy Taskdefs -->
<path id="ivy.lib.path">
<fileset dir="C:/java-tools/apache-ivy-2.0.0" includes="*.jar"/>
</path>
<taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant"
classpathref="ivy.lib.path"/>
<!-- Reference Ivy settings -->
<ivy:settings file="${basedir}/../ivysettings.xml"/>
<target name="ivy.resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve pattern=“${lib.dir}/[conf]/[artifact].[ext]”/>
</target>
<target name="ivy.publish" description="--> publish artifacts to local repository">
<ivy:publish resolver=“local” pubrevision=“${version}”>
<artifacts pattern=“dist/[artifact].[ext]”/>
</ivy:publish>
</target>
7. Ant + Ivy
Build steps defined and executed with Ant
Dependencies managed with Ivy
Ant targets to install, retrieve artifacts
from Ivy repository
8. Ant + Ivy
Image copied from http://ant.apache.org/ivy/history/2.0.0/principle.html
9. Maven
Project is defined by POM (Project Object
Model)
Projects can contain sub-projects (modules)
Based on recommended project structure (e.g.
src/main/java, src/main/resources, src/test/java, …)
Artifact-focused (i.e. What files does this build
produce?)
Heavy emphasis on default configuration
10. Maven
Build Lifecycle is defined as Phases, which
execute sequentially
1. Validate
2. Compile
3. Test
4. Package
5. Integration-test
6. Verify
7. Install
8. Deploy
11. Maven
Each Phase can be made up of zero or more
Goals (tasks)
Project-specific configuration involves binding
specific goals to specific phases (beyond the default
settings)
Extensible plugin system (called Mojos)
Java-based or Ant-based
Comprehensive set of third-party plugins available
12. Gradle
Built on top of Ant + Ivy
Build DSL written in Groovy
Uses Groovy AntBuilder
ant.compile, ant.jar
Plugins define common tasks to build
different types of projects
java, groovy, war, …
13. Gradle
Assumes Maven conventions for file
locations (drop-in replacement for Maven)
Can be altered with the convention object
Can use existing Maven or Ivy
repositories
14. Buildr
Built on Ruby
Rake is similar to Ant (Ruby Make)
RubyGems is similar to rpm (package
manager, handles dependencies)
Build script written in Ruby (internal DSL)
18. Results Matrix
Desired Feature Ant + Ivy Maven Gradle Buildr
Dependency management
Versioning manually
Compile Java code, build
jars
Execute tests, report
results, fail build on failed
tests
Doesn’t include
html reports
Doesn’t include
html reports
Run quality check tools
(PMD, FindBugs, JavaDoc)
3rd
party task
libraries
3rd
party
plugins
Manually Manually
File generation (XmlBeans,
XSL, Velocity, AspectJ)
3rd
party task
libraries
3rd
party
plugins
Manually Manually
Out of the box
Not supported
19. Results Matrix cont’d
Desired Feature Ant + Ivy Maven Gradle Buildr
Property expansion / token
substitution
Build vs. deploy vs. release Manually
defined
Full control when needed Custom XML
“scripts”
Write custom
plugin or
embedded Ant
script
Groovy code
directly in build
file
Ruby code
directly in build
file
Cross-platform
Runs on JVM Runs on JVM Runs on JVM
Runs on Ruby,
may need to
compile from
source
IDE Support
Eclipse only
Documentation / Support Excellent Growing but
still
inconsistent
Decent project
documentation,
few articles
Good project
documentation,
few articles
Out of the box
Not supported
20. Subjective Evaluation
Ant, Ivy, Maven have been around the longest
Restrictive vs. Open philosophy
Smart defaults
Dependency Management is a Good Thing™
Ant has by far the best documentation and
examples available online
Gradle is the least mature (but very promising)
Buildr is very cool but has potential platform
issues (Ruby vs. JRuby, 64-bit)