21
Inside Grails: The Build System & Plugin Management by Peter Ledbrook

Grails Internals Ggug Dec 2009

Embed Size (px)

Citation preview

Page 1: Grails Internals Ggug Dec 2009

Inside Grails: The Build System& Plugin Management

byPeter Ledbrook

Page 2: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Page 3: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Shell scripts

startGrails launches VM

Adds groovy-all & grails-bootstrap to system classpath

Page 4: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Create GrailsRootLoader

Load classpath from groovy-starter.conf

Load GrailsScriptRunner in GRL and execute

Class loader isolation

Page 5: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Create BuildSettings if it doesn't exist

Populate root loader

Initialise Gant

Pre-populate Gant binding

Interactive mode

Page 6: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Parse & run Grails scripts

Page 7: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Load Grails using given class loader

Isolate Grails from parent class loader

Page 8: Grails Internals Ggug Dec 2009

Starting The Grails Build System

grails grails­debug

startGrails

GrailsStarter

GrailsScriptRunner

Gant

Ant task Maven plugin

GrailsBuildHelper

BuildSettings

Project structure

BuildConfig.groovy & settings.groovy

Dependencies

Page 9: Grails Internals Ggug Dec 2009

Class loader hell?

System loader

GrailsRootLoader

URLClassLoader

System loader

GrailsClassLoader

“rootLoader”

“classLoader”

grailsApp.classLoader

Script cacheResourcesJARs (application & plugins)

Script cacheClasses

Artifacts (*.groovy)

Page 10: Grails Internals Ggug Dec 2009

Context Class Loader

Starts as root loader (GrailsStarter)

Becomes ”classLoader” (GrailsScriptRunner)

”classes” directory

Ends as Grails application class loader (DefaultGrailsApplication)

Page 11: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Page 12: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

General settings

Create PluginBuildSettings

Configure environment

getPropertyValue()

Page 13: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Set up common/compile/test/runtime classpaths

Target classpath

grails.*.classpath Ant paths

Page 14: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Install Ant build listener

Load event scripts (_Events.groovy)

Add event() method

Page 15: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Grails app without servlet container

Create application context, with

GrailsApplication

GrailsPluginManager

Used by integration tests, generate scripts, and others

Page 16: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Grails app with servlet container

Should use runtime classpath

Plugin change scanner

Page 17: Grails Internals Ggug Dec 2009

Grails Scripts

_GrailsSettings _GrailsClasspath _GrailsEvents

_GrailsBootstrap _GrailsRun _GrailsWar

Common

End use

Create WAR

Package runtime dependencies

Page 18: Grails Internals Ggug Dec 2009

Plugins

Build

Manage plugin installations

Plugin dependencies

Scripts

Lib dependencies

Repositories

Runtime

Load plugins

Add Spring beans

Add dynamic methods

Web descriptor

Page 19: Grails Internals Ggug Dec 2009

Plugins in the Build

Scripts

_PluginDependencies _GrailsPlugins _GrailsPluginDev

Classes

PluginBuildSettings PluginInfoGrailsPluginUtils

Files

plugin.xml dependencies.groovy

Page 20: Grails Internals Ggug Dec 2009

Plugins at Runtime

*GrailsPlugin

GrailsPluginManager

AbstractGrailsPluginManager

DefaultGrailsPluginManager

GrailsPlugin

AbstractGrailsPlugin

DefaultGrailsPlugin

*GrailsPlugin*GrailsPluginPlugin  descriptors

Page 21: Grails Internals Ggug Dec 2009

Overlap

_PluginDependencies: target ”loadPlugins”

Called by bootstrap, package app

Required to generate web.xml

Creates temporary GrailsApplication and GrailsPluginManager instances

Plugins may be loaded twice or more!