Java Build Tool Comparison

Post on 17-Oct-2014

137 views 2 download

Tags:

Transcript of Java Build Tool Comparison

Java Build Tool Comparison

HJUG - April 29th, 2009John Tyler

Java Build Tool Comparison

• Desired Features• The Contenders

• Ant + Ivy• Maven• Gradle• Buildr• Others

• Results Matrix• Subjective Evaluation• Which Would You Choose?

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

Ant + Ivy

Ant is ubiquitous Java-based build toolUses XML “script” files

Ivy is a dependency managerArtifact repositoryDependency resolution, including transitive

(Project A -> Hibernate -> Commons-Collections)

Sync with external repositories

Ant + Ivy

Module dependencies are declared in ivy.xml

<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<info organisation=“org.hjug" module=“myModule"/> <dependencies> <dependency org="org.apache" name="ant" rev="1.7.0"/> <dependency org="org.apache" name="axis" rev="1.2rc3"/> <dependency org="org.junit" name="junit" rev="4.4"/> </dependencies></ivy-module>

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>

Ant + Ivy

Build steps defined and executed with Ant Dependencies managed with Ivy Ant targets to install, retrieve artifacts

from Ivy repository

Ant + Ivy

Image copied from http://ant.apache.org/ivy/history/2.0.0/principle.html

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

Maven

Build Lifecycle is defined as Phases, which execute sequentially

1. Validate2. Compile3. Test4. Package5. Integration-test6. Verify7. Install8. Deploy

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

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, …

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

Buildr

Built on RubyRake is similar to Ant (Ruby Make)RubyGems is similar to rpm (package

manager, handles dependencies)Build script written in Ruby (internal DSL)

Buildr

Pre-defined tasks clean compile build upload install javadoc package test uninstall

Buildr

Assumes Maven conventions for file locations (drop-in replacement for Maven)Can be altered

Can use existing Maven repositories

Others

Gant Rake EasyAnt Custom ?

Results MatrixDesired 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

Results Matrix cont’dDesired 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

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)

Which Would You Choose?