buildr-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Antoine Toulme <anto...@lunar-ocean.com>
Subject Re: JAXB XJC module
Date Tue, 07 Sep 2010 19:20:02 GMT
That's Rake's way of expressing dependencies. Not my favorite but it works.

An other way to do it I think:
file(_("somefile")).enhance [sources]

On Tue, Sep 7, 2010 at 11:56, Mark Petrovic <mspetrovic@gmail.com> wrote:

> Thanks much.  I think I get it.
>
> But let me ask this:  in this HOWTO
>
>
> https://cwiki.apache.org/confluence/display/BUILDR/How+to+generate+sources+before+compilation
>
> what does the argument to file() actually do or mean?
>
> file(_("target/generated-source") => sources)
>
> I see it's a hash, but what does it actually say?  "path_to 'foo' is a key
> in a hash where 'sources' is the value".  Huh?
>
>
>
> On Sep 7, 2010, at 8:22 AM, Rhett Sutphin wrote:
>
> > Hi Mark,
> >
> > On Sep 7, 2010, at 10:04 AM, Mark Petrovic wrote:
> >
> >> 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.
> >
> > The file(path) call creates a FileTask in rake[1].  (#to_s on a rake task
> returns its name; the name of a file task is the path; this is why puts
> file("foo") prints foo.)   This is the code that rake will execute if it
> determines that it needs an up to date version of that path.
> >
> > Your file task is what is returned by JAXB_XJC.doWork, and so is what is
> returned by compile_jaxb.  In ruby if there's no explicit return, the result
> of the last expression in a method is the return value.
> >
> > When you call compile.from compile_jaxb(...), buildr adds the file task
> to the set of dependencies for the compile task for the 'restapi' project.
>  Thus, when you do restapi:compile (or any task which depends on that task),
> your file task is invoked if rake decides that its path is out of date.  If
> you're curious about this, try running restapi:compile with --trace; you
> should be able to see rake evaluating the dependency tree.
> >
> > Welcome to ruby and rake and buildr,
> > Rhett
> >
> > [1]: which is the ruby build tool that buildr is built on top of
> >
> >>
> >> 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
> >>
> >>
> >
>
>
> --
> Mark Petrovic
>
>
>

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