Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Practical Introduction to Apache Buildr

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
boia01
November 09, 2011

Practical Introduction to Apache Buildr

Buildr is a modern build system for Java-based applications including support for Scala, Groovy and a growing number of JVM languages and tools. Buildr combines the expressiveness of the Ruby scripting language with a familiar dependency-based task execution model and project-level structure similar to Apache Maven. This session will introduce Buildr and demonstrate practical solutions to common build problems.

boia01

November 09, 2011

Transcript

72 slides
  1. # This is Rake code task "compile A" do #

    code to compile A end task "compile B" do # code to compile B end task "compile C" => ["compile A", "compile B"] do # code to compile C end task "package A,B,C" => ["compile A", "...", "compile C"] do # code to package A, B and C end task :default => “package A, B, C”
  2. # This is Buildr code define "My application" do define

    "A" do package :jar end define "B" do package :jar end define "C" do compile.with projects("A", "B") package :jar end package(:war).using :libs => projects("A", "B", "C") end
  3. # This is Buildr code define "My application" do define

    "A" do package :jar end define "B" do package :jar end define "C" do compile.with projects("A", "B") package :jar end package(:war).using :libs => projects("A", "B", "C") end Parent projects implicitly depend on children
  4. my-application/ ├── A │ └── src │ ├── main │

    │ ├── java │ │ └── resources │ └── test │ └── java ├── B │ └── src │ ├── main │ │ └── scala │ └── test │ └── scala ├── C │ └── src │ └── main │ └── groovy └── src └── main ├── java └── webapp Standard directory structure
  5. $ buildr package (in /home/boisvert/tmp/buildr-example, development) Building buildr-example Compiling buildr-example:a

    into /home/boisvert/tmp/buildr- example/a/target/classes Compiling buildr-example:b into /home/boisvert/tmp/buildr- example/b/target/classes Packaging buildr-example-a-1.0.0.jar Packaging buildr-example-b-1.0.0.jar Compiling buildr-example:c into /home/boisvert/tmp/buildr- example/c/target/classes Packaging buildr-example Packaging buildr-example-c-1.0.0.jar Packaging buildr-example-1.0.0.war Running integration tests... Completed in 0.779s
  6. # Actual Rake code class FileTask < Task def needed?

    !File.exist?(name) || out_of_date? end private def out_of_date? @prerequisites.any? { |n| p.timestamp > timestamp} end end
  7. # Buildfile repositories.remote << "http://www.ibiblio.org/maven2/" LOG4J = "log4j:log4j:jar:1.2.15" define 'my-library'

    do manifest['Copyright'] = 'Acme Inc (C) 2008' compile.options.target = '1.5' compile.with LOG4J package :jar end
  8. # Buildfile repositories.remote << "http://www.ibiblio.org/maven2/" LOG4J = "log4j:log4j:jar:1.2.15" define 'my-library'

    do manifest['Copyright'] = 'Acme Inc (C) 2008' compile.options.target = '1.5' compile.with LOG4J package :jar end all your repos are belong to us!
  9. # Buildfile repositories.remote << "http://www.ibiblio.org/maven2/" LOG4J = "log4j:log4j:jar:1.2.15" define 'my-library'

    do manifest['Copyright'] = 'Acme Inc (C) 2008' compile.options.target = '1.5' compile.with LOG4J package :jar end artifacts are tasks, too.
  10. # Buildfile repositories.remote << "http://www.ibiblio.org/maven2/" LOG4J = "log4j:log4j:jar:1.2.15" define 'my-library'

    do manifest['Copyright'] = 'Acme Inc (C) 2008' compile.options.target = '1.5' compile.with LOG4J package :jar end tasks are wired implicitly
  11. Example: Scala plugin require 'buildr/scala' # brings in: # #

    - automatic detection # (src/main/scala, src/test/scala, src/spec/scala) # # - incremental compilation # # - mixed java + scala compilation # # - scaladoc generation # # - scalatest, specs and scalacheck testing # # - continuous compilation
  12. # if you have Ruby installed % gem install buildr

    or, # JRuby all-in-one package % unzip buildr-all-in-one.zip
  13. Ant Example: XMLBeans <taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpath="path/to/xbean.jar" /> <xmlbean classgendir="${build.dir}"

    classpath="${class.path}" failonerror="true"> <fileset basedir="src" excludes="**/*.xsd"/> <fileset basedir="schemas" includes="**/*.*"/> </xmlbean>
  14. Ant Example: XMLBeans def xmlbeans(files) do Buildr.ant "xmlbeans" do |ant|

    ant.taskdef \ :name => "xmlbeans", :classname => "org.apache.xmlbeans.impl.tool.XMLBean", :classpath => 'org.apache.xmlbeans:xmlbeans:jar:2.3.0' ant.xmlbeans \ :classpath => project.compile.dependencies, :srcgendir => project._('target/generated') :failonerror => "true" do files.flatten.each do |file| ant.fileset File.directory?(file) ? { :dir => file } : { :file => file } end end end
  15. # Convert .pom to ivy.xml module POM_to_IVY extend self ANT

    = Buildr.ant('convertpom') do |ant| ant.taskdef :name => "convertpom", :classname => "org.apache.ivy.ant.IvyConvertPom" end end def convert(pom_file, ivy_file) ANT.convertpom :pomFile => pom_file, :ivyFile => ivy_file end end
  16. define :webapp do # regenerate app.js when any .coffee file

    changes file('target/js/app.js') => Dir['src/main/coffee/*.coffee']) do sh "dependence src/main/coffee/ -t coffee -o target/js" end resources.enhance ['target/js/app.js'] end
  17. # Generate SQL DDL schemas for all databases %w{ derby

    mysql oracle sqlserver postgres }.each do |db| db_xml = _("src/main/descriptors/persistence.#{db}.xml") partial_sql = file("target/partial.#{db}.sql"=>db_xml) do OpenJPA.mapping_tool \ :properties => db_xml, :action => "build", :sql => db.to_s, :classpath => projects("store", "dao") end # Add Apache license header header = _("src/main/scripts/license-header.sql") sql = concat(_("target/#{db}.sql") => [header, partial_sql]) build sql end
  18. # Compile using all Eclipse BIRT libraries BIRT_WAR = artifact(“org.eclipse.birt:birt:war:1.4.1”)

    unzip_birt = unzip _("target/birt") => BIRT_WAR unzip_birt.enhance do compile.with Dir[_("target/birt/WEB-INF/lib") + "/*.jar"] end compile.enhance [unzip_birt]
  19. Testing Your Build # rspec code check package(:war).entry('META-INF/MANIFEST'), 'should have

    license' do it.should contain(/Copyright (C) 2011/) end check file('target/classes/killerapp/Code.class'), 'should exist' do it.should exist end
  20. Example: Extension module GitVersion include Buildr::Extension @version = `git log

    -1 --pretty=format:%H` after_define do |project| project.packages.each do |jar| f = file project._("target/git-version.txt") do |f| Buildr.write f.to_s, @version end jar.enhance [f] jar.include f, :as => "META-INF/git-version.txt" end end end
  21. # apply to a single project define 'my-project' do extend

    GitVersion end # apply to all projects class Buildr::Project include GitVersion end

More Decks by boia01

Other Decks in Programming