buildr-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Mark Petrovic <mspetro...@gmail.com>
Subject JAXB XJC module
Date Tue, 07 Sep 2010 15:04:53 GMT
I'm pretty new at this Ruby stuff, but between some experience and outright mimicry, I've managed
to produce this JAXB XJC method, which is a candidate for inclusion in the Buildr trunk. 
I think it's enough to be useful and to get people started with a canned JAXB compiler, despite
the code being slightly self-conscious in a way only a neophyte can affect.

Question:  is the buried file() call in doWork() ultimately responsibile for adding a new
directory element (e.g., 'target/generated-sources/xjc') to the list of compile sources? 
I don't know how this thing actually works, but it does.  file(foo) returns foo, which I think
is what compile.with sees when it adds to the compile sources list.

Committers, feel free to make it more clueful and tasteful in whatever way you see fit.

1) This code goes in a file named 'jaxb-xjc.rb':

require 'buildr/java'
require 'buildr/java/ant'

# Wrapped JAXB-XJC compiler
# https://jaxb.dev.java.net/nonav/2.2.1/docs/xjcTask.html

module Buildr
  module JAXB_XJC

    VERSION = "2.2.1"

    REQUIRES = ["javax.xml.bind:jaxb-api:jar:#{VERSION}",
                "com.sun.xml.bind:jaxb-impl:jar:#{VERSION}",
                "com.sun.xml.bind:jaxb-xjc:jar:#{VERSION}"]

    class << self
      def doWork(options)
        outdir = options[:outdir]
        schemafile = options[:schemafile]
        package = options[:package]

        pkgdir = outdir + '/' + package.gsub('.', '/')
        mkdir_p pkgdir.to_s

        file(outdir) do |dir|
          mkdir_p dir.to_s
          Buildr.ant('xjc') do |ant|
            ant.taskdef :name=>"xjc", :classname=>"com.sun.tools.xjc.XJCTask", :classpath=>requires.join(File::PATH_SEPARATOR)
            ant.xjc :schema=>schemafile, :destdir=>dir, :package=>package, :removeOldOutput=>'yes'
do
              ant.produces :dir => pkgdir, :includes => '**/*.java'
            end
          end
        end
      end

      def requires()
        @requires ||= Buildr.artifacts(REQUIRES).each { |artifact| artifact.invoke }.map(&
:to_s)
      end
    end

    def compile_jaxb(options = nil)
      jaxb_opts = {}
      JAXB_XJC.doWork jaxb_opts.merge(options || {})
    end

  end

  class Project
    include JAXB_XJC
  end
end



2) Use it in a project as


require 'jaxb-xjc'

...

    desc 'REST API'
    define 'restapi' do
      compile.from compile_jaxb :outdir => _('target/generated-sources/xjc'),
                          :schemafile => _("src/main/resources/api.xsd"),
                           :package => "org.foo.api"
      package :jar, :id => 'restapi'
    end





--
Mark Petrovic



Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message