300 likes | 910 Views
Java Build Tool Comparison. Desired FeaturesThe ContendersAnt IvyMavenGradleBuildrOthersResults MatrixSubjective EvaluationWhich Would You Choose? . Desired Features. Dependency managementVersioningCompile Java code, build jarsExecute tests and report results, fail build on failed test
E N D
1. Java Build Tool Comparison HJUG - April 29th, 2009
John Tyler
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
5. 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>
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
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
Validate
Compile
Test
Package
Integration-test
Verify
Install
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)
15. Buildr Pre-defined tasks
clean
compile
build
upload
install
javadoc
package
test
uninstall
16. Buildr Assumes Maven conventions for file locations (drop-in replacement for Maven)
Can be altered
Can use existing Maven repositories
17. Others Gant
Rake
EasyAnt
Custom ?
18. Results Matrix
19. Results Matrix cont’d
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)
21. Which Would You Choose?