I don't know which source control system you're using, but I am very happy
with svn:externals for a use case similar to this.

On Thu, Jul 9, 2009 at 7:51 PM, Philip Crotwell <[email protected]>wrote:

> I am using a separate file because I have a dozen projects that I want
> to use this code (it will create a bash run script) and as they are
> unrelated projects they don't really fit into the "multiproject" idea.
> Since this will hopefully be multipurpose code seems reasonable to
> have it separate from any one particular project and just be loaded by
> those that need it.
>
> I can also imagine the use case of making use of third party groovy
> code within a build. You certainly wouldn't want to copy/paste it into
> build.gradle and would rather import/load the file.
>
> What I am trying to do might be better done as a gradle plugin instead
> of just some groovy code laying around but as I am just starting I
> didn't want to deal with the extra level of complication. I may pursue
> that once I have something working.
>
> Your "new GroovyClassLoader(this.class.classloader)" suggestion work
> perfectly, so I am all set.
>
> I would think that making use of groovy code in separate files would
> be a common need, not just in gradle but in groovy in general. Too bad
> there isn't something more straightforward to accomplish this, like a
> source("myfile.groovy")
> but I guess that is a question for the groovy people.
>
> thanks for the help,
> Philip
>
>
> On Thu, Jul 9, 2009 at 3:03 AM, Adam Murdoch<[email protected]> wrote:
> >
> >
> > Philip Crotwell wrote:
> >>
> >> Hi
> >>
> >> I am trying to use a groovy class in my build.gradle that is defined
> >> in a separate file. Because I want all my build scripts to not require
> >> external configuration (like classpath)
> >
> > Why does it need to be a separate file? I'm curious, because we are
> making
> > some improvements to build script classpath handling in Gradle 0.7, and I
> > would like to understand what your use case is, and whether we would
> solve
> > it with the 0.7 changes.
> >
> >>  I am trying to dynamically
> >> load the groovy code from within the gradle buildfile. I found two
> >> items that seem to help with this:
> >>
> >
> > Another option you have is to place the file under
> buildSrc/src/main/groovy.
> > It will then be automatically compiled and included in the build script
> > classpath.
> >
> >> http://groovy.codehaus.org/Influencing+class+loading+at+runtime
> >>
> >>
> http://www.nabble.com/run-main%2C-package-all-libs%2C-run-easyb-td22395236.html#a22410033
> >>
> >> Both say that you should add the URL to the root GroovyClassLoader.
> >> However, when I try this in my build.gradle:
> >>
> >> createTask('play') {
> >>    println 'rootLoader: '+this.class.classLoader.rootLoader
> >>    def classLoader = this.class.classLoader
> >>    while (classLoader != null) {
> >>        println 'parent loader '+classLoader.class+'  '+classLoader
> >>        classLoader = classLoader.parent
> >>    }
> >> }
> >>
> >> I get this:
> >> crotwell$ gradle play
> >> :TauP:play
> >> rootLoader: null
> >> parent loader class java.net.URLClassLoader
> >>  java.net.urlclassloa...@c9e1cc
> >> parent loader class java.net.URLClassLoader
> >>  java.net.urlclassloa...@cd8669
> >> parent loader class java.net.URLClassLoader
> >>  java.net.urlclassloa...@337838
> >> parent loader class sun.misc.Launcher$ExtClassLoader
> >> sun.misc.launcher$extclassloa...@cc7ad6
> >>
> >> BUILD SUCCESSFUL
> >>
> >> and so it would seem that there is no GroovyClassLoader in the class
> >> loader hierarchy that you get from this.class.classLoader. That seems
> >> strange as I thought we were using groovy inside of a Task.
> >>
> >>
> >
> > In this case, 'this' refers to the build script, rather than the task.
> The
> > build script is compiled into the cache in the .gradle directory, and
> then
> > loaded using a URLClassLoader, rather than a GroovyClassLoader (I wonder
> if
> > we should use a GroovyClassLoader, instead).
> >
> >> I found another post that just constructed a GroovyClassLoader and used
> >> it,
> >> http://www.mail-archive.com/[email protected]/msg01296.html
> >> Which more or less works. If I create a GroovyClassLoader myself, I
> >> can load my class, but it of course is missing all the gradle stuff so
> >> I can't do something like:
> >> import org.gradle.api.artifacts.report.IvyDependency
> >>
> >> So, what is the correct way to load groovy code from a separate file
> >> into a gradle build, and still have access to the gradle classes?
> >>
> >>
> >
> > There's no one way to do this. GroovyClassLoader is a good option.
> > GroovyShell is another option if you want to execute a script.
> >
> > Either way, you need to construct the GroovyClassLoader or GroovyShell
> with
> > the build script's ClassLoader as its parent ClassLoader. This way any
> > classes loaded by the ClassLoader will be able to see all classes visible
> to
> > the build script:
> >
> > def classLoader = new GroovyClassLoader(this.class.classLoader)
> > classLoader.addClasspath(... some path ...) // or addURL()
> > def myObject = classLoader.parseClass(new File(... some groovy file
> > ...)).newInstance()
> >
> >
> > Adam
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe from this list, please visit:
> >
> >   http://xircles.codehaus.org/manage_email
> >
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
>    http://xircles.codehaus.org/manage_email
>
>
>

Reply via email to