| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
| "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
| <head> |
| <!-- Matomo --> |
| <script> |
| var _paq = window._paq = window._paq || []; |
| /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ |
| _paq.push(["setDoNotTrack", true]); |
| _paq.push(["disableCookies"]); |
| _paq.push(['trackPageView']); |
| _paq.push(['enableLinkTracking']); |
| (function() { |
| var u="https://analytics.apache.org/"; |
| _paq.push(['setTrackerUrl', u+'matomo.php']); |
| _paq.push(['setSiteId', '79']); |
| var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; |
| g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); |
| })(); |
| </script> |
| <!-- End Matomo Code --> |
| <title>5 The Command Line 3.3.7</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| <link rel="stylesheet" href="../css/main.css" type="text/css" media="screen, print" title="Style" charset="utf-8"/> |
| <link rel="stylesheet" href="../css/pdf.css" type="text/css" media="print" title="PDF" charset="utf-8"/> |
| <script type="text/javascript"> |
| function addJsClass() { |
| var classes = document.body.className.split(" "); |
| classes.push("js"); |
| document.body.className = classes.join(" "); |
| } |
| </script> |
| </head> |
| |
| <body class="body" onload="addJsClass();"> |
| <div id="navigation"> |
| <div class="navTitle"> |
| |
| The Grails Framework |
| </div> |
| <div class="navLinks"> |
| <ul> |
| <li> |
| <div id="nav-summary" onmouseover="toggleNavSummary(false)" onmouseout="toggleNavSummary(true)"> |
| <a href="../guide/index.html" class="button">Table of contents</a> |
| |
| <div id="nav-summary-childs" style="display:none;"> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/introduction.html"><strong>1</strong><span>Introduction</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/gettingStarted.html"><strong>2</strong><span>Getting Started</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/upgrading.html"><strong>3</strong><span>Upgrading from Grails 3.2.x</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/commandLine.html"><strong>5</strong><span>The Command Line</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/profiles.html"><strong>6</strong><span>Application Profiles</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/GORM.html"><strong>7</strong><span>Object Relational Mapping (GORM)</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/theWebLayer.html"><strong>8</strong><span>The Web Layer</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/traits.html"><strong>9</strong><span>Traits</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/REST.html"><strong>10</strong><span>REST</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/async.html"><strong>11</strong><span>Asynchronous Programming</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/validation.html"><strong>12</strong><span>Validation</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/services.html"><strong>13</strong><span>The Service Layer</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/staticTypeCheckingAndCompilation.html"><strong>14</strong><span>Static Type Checking And Compilation</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/testing.html"><strong>15</strong><span>Testing</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/i18n.html"><strong>16</strong><span>Internationalization</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/security.html"><strong>17</strong><span>Security</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/plugins.html"><strong>18</strong><span>Plugins</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/spring.html"><strong>19</strong><span>Grails and Spring</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/deployment.html"><strong>21</strong><span>Deployment</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0"><a href="../guide/contributing.html"><strong>22</strong><span>Contributing to Grails</span></a> |
| </div> |
| |
| </div> |
| </div> |
| </li> |
| <li class="separator selected"> |
| <a id="ref-button" onclick="localToggle(); return false;" href="#">Quick Reference</a> |
| </li> |
| </ul> |
| </div> |
| |
| |
| </div> |
| |
| <table id="colset" border="0" cellpadding="0" cellspacing="0"> |
| <tr> |
| <td id="col1"> |
| <div id="main" class="corner-all"> |
| |
| |
| <div class="toc-item prev-left"><a href="../guide/conf.html"><< <strong>4</strong><span>Configuration</span></a></div> |
| |
| |
| <span id='toggle-col1' class="toggle">(<a href="#" onclick="localToggle(); return false;">Quick Reference</a>)</span> |
| |
| |
| <div class="toc-item next-right"><a href="../guide/profiles.html"><strong>6</strong><span>Application Profiles</span> >></a></div> |
| |
| |
| |
| <div class="project"> |
| <h1>5 The Command Line</h1> |
| |
| <p><strong>Version:</strong> 3.3.7</p> |
| </div> |
| |
| |
| <div id="table-of-content"> |
| <h2>Table of Contents</h2> |
| |
| <div class="toc-item" style="margin-left:0px"><a href="#interactiveMode"><strong>5.1</strong><span>Interactive Mode</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0px"><a href="#creatingCustomScripts"><strong>5.2</strong><span>Creating Custom Scripts</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0px"><a href="#creatingCustomCommands"><strong>5.3</strong><span>Creating Custom Commands</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0px"><a href="#reusingGrailsScripts"><strong>5.4</strong><span>Re-using Grails scripts</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:0px"><a href="#gradleBuild"><strong>5.5</strong><span>Building with Gradle</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:10px"><a href="#gradleDependencies"><strong>5.5.1</strong><span>Defining Dependencies with Gradle</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:10px"><a href="#gradleTasks"><strong>5.5.2</strong><span>Working with Gradle Tasks</span></a> |
| </div> |
| |
| <div class="toc-item" style="margin-left:10px"><a href="#gradlePlugins"><strong>5.5.3</strong><span>Grails plugins for Gradle</span></a> |
| </div> |
| |
| </div> |
| |
| |
| |
| <a name="4. The Command Line"><!-- Legacy link --></a> |
| <h1 id="commandLine">5 The Command Line</h1> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>Grails 3.0’s command line system differs greatly from previous versions of Grails and features APIs for invoking Gradle for build related tasks, as well as performing code generation.</p> |
| </div> |
| <div class="paragraph"> |
| <p>When you type:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails <<command name>></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Grails searches the <a href="http://bintray.com/grails/profiles">profile repository</a> based on the profile of the current application. If the profile is for a web application then commands are read from the web profile and the base profile which it inherits from.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Since command behavior is profile specific the web profile may provide different behavior for the <code>run-app</code> command then say a profile for running batch applications.</p> |
| </div> |
| <div class="paragraph"> |
| <p>When you type the following command:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails run-app</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>It will first search the application, and then the profile for commands:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>PROJECT_HOME/src/main/scripts/run-app.groovy</code></p> |
| </li> |
| <li> |
| <p><code><a href="#profile">[profile]</a>/commands/run-app.groovy</code></p> |
| </li> |
| <li> |
| <p><code><a href="#profile">[profile]</a>/commands/run-app.yml</code></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>To get a list of all commands and some help about the available commands type:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">grails help</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>which outputs usage instructions and the list of commands Grails is aware of:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">grails <<environment>>* <<target>> <<arguments>>*' |
| |
| | Examples: |
| $ grails dev run-app |
| $ grails create-app books |
| |
| | Available Commands (type grails help 'command-name' for more info): |
| | Command Name Command Description |
| ---------------------------------------------------------------------------------------------------- |
| clean Cleans a Grails application's compiled sources |
| compile Compiles a Grails application |
| ...</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Refer to the Command Line reference in the Quick Reference menu of the reference guide for more information about individual commands |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="_arguments">Arguments</h3> |
| <div class="paragraph"> |
| <p>The <code>grails</code> command is a front to a <code>gradle</code> invocation, because of this there can be unexpected side-effects. |
| For example, when executing <code>grails -Dapp.foo=bar run-app</code> the <code>app.foo</code> system property won’t be available to your application. This is because <code>bootRun</code> in your <code>build.gradle</code> configures the system properties. |
| To make this work you can simply append all <code>System.properties</code> to <code>bootRun</code> in <code>build.gradle</code> like:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">bootRun{ |
| systemProperties <span class="predefined-type">System</span>.properties <span class="comment">// Please note not to use '=', because this will override all configured systemProperties. This will append them.</span> |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Or if you only want to pass through a limited set, you can prefix your system properties using an arbitrary prefix and configure <code>bootRun</code> like:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">bootRun{ |
| bootRun { |
| systemProperties <span class="predefined-type">System</span>.properties.inject([:]){acc,item-> item.key.startsWith(<span class="string"><span class="delimiter">'</span><span class="content">boot.</span><span class="delimiter">'</span></span>)?acc << [(item.key.substring(<span class="string"><span class="delimiter">'</span><span class="content">boot.</span><span class="delimiter">'</span></span>.length())):item.value]:acc } |
| } |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>In this example only system properties starting with <code>boot.</code> are passed through.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Application and JVM arguments should be specified in <code>bootRun</code> as well.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">bootRun{ |
| bootRun { |
| jvmArgs(<span class="string"><span class="delimiter">'</span><span class="content">-Dspring.output.ansi.enabled=always</span><span class="delimiter">'</span></span>) |
| args(<span class="string"><span class="delimiter">'</span><span class="content">--app.foo=bar</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">--app.bar=foo</span><span class="delimiter">'</span></span>) <span class="comment">// Override the `app.foo` and `app.bar` config options (`grailsApplication.config`)</span> |
| } |
| }</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_non_interactive_mode">non-interactive mode</h3> |
| <div class="paragraph"> |
| <p>When you run a script manually and it prompts you for information, you can answer the questions and continue running the script. But when you run a script as part of an automated process, for example a continuous integration build server, there’s no way to "answer" the questions. So you can pass the <code>\--non-interactive</code> switch to the script command to tell Grails to accept the default answer for any questions, for example whether to install a missing plugin.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails war --non-interactive</code></pre> |
| </div> |
| </div> |
| </div> |
| |
| |
| <h2 id="interactiveMode">5.1 Interactive Mode</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/interactiveMode.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>Interactive mode is a feature of the Grails command line which keeps the JVM running and allows for quicker execution of commands. To activate interactive mode type 'grails' at the command line and then use TAB completion to get a list of commands:</p> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <img src="../img/interactive-output.png" alt="interactive output"> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If you need to open a file whilst within interactive mode you can use the <code>open</code> command which will TAB complete file paths:</p> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <img src="../img/interactive-open-cmd.png" alt="interactive open cmd"> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Even better, the <code>open</code> command understands the logical aliases 'test-report' and 'dep-report', which will open the most recent test and dependency reports respectively. In other words, to open the test report in a browser simply execute <code>open test-report</code>. You can even open multiple files at once: <code>open test-report test/unit/MyTests.groovy</code> will open the HTML test report in your browser and the <code>MyTests.groovy</code> source file in your text editor.</p> |
| </div> |
| <div class="paragraph"> |
| <p>TAB completion also works for class names after the <code>create-*</code> commands:</p> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <img src="../img/interactive-complete-class.png" alt="interactive complete class"> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If you need to run an external process whilst interactive mode is running you can do so by starting the command with a !:</p> |
| </div> |
| <div class="imageblock"> |
| <div class="content"> |
| <img src="../img/interactive-run-external.png" alt="interactive run external"> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Note that with ! (bang) commands, you get file path auto completion - ideal for external commands that operate on the file system such as 'ls', 'cat', 'git', etc.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To exit interactive mode enter the <code>exit</code> command. Note that if the Grails application has been run with <code>run-app</code> normally it will terminate when the interactive mode console exits because the JVM will be terminated. An exception to this would be if the application were running in forked mode which means the application is running in a different JVM. In that case the application will be left running after the interactive mode console terminates. If you want to exit interactive mode and stop an application that is running in forked mode, use the <code>quit</code> command. The <code>quit</code> command will stop the running application and then close interactive mode.</p> |
| </div> |
| |
| |
| <h2 id="creatingCustomScripts">5.2 Creating Custom Scripts</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/creatingCustomScripts.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>You can create your own Command scripts by running the <a href="../ref/Command%20Line/create-script.html">create-script</a> command from the root of your project. For example the following command will create a script called <code>src/main/scripts/hello-world.groovy</code>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails create-script hello-world</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| In general Grails scripts should be used for scripting the Gradle based build system and code generation. Scripts cannot load application classes and in fact should not since Gradle is required to construct the application classpath. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>See below for an example script that prints "Hello World":</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">description <span class="string"><span class="delimiter">"</span><span class="content">Example description</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">grails hello-world</span><span class="delimiter">"</span></span> |
| |
| println <span class="string"><span class="delimiter">"</span><span class="content">Hello World</span><span class="delimiter">"</span></span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>description</code> method is used to define the output seen by <code>grails help</code> and to aid users of the script. The following is a more complete example of providing a description taken from the <code>generate-all</code> command:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">description( <span class="string"><span class="delimiter">"</span><span class="content">Generates a controller that performs CRUD operations and the associated views</span><span class="delimiter">"</span></span> ) { |
| usage <span class="string"><span class="delimiter">"</span><span class="content">grails generate-all <<DOMAIN CLASS>></span><span class="delimiter">"</span></span> |
| flag <span class="key">name</span>:<span class="string"><span class="delimiter">'</span><span class="content">force</span><span class="delimiter">'</span></span>, <span class="key">description</span>:<span class="string"><span class="delimiter">"</span><span class="content">Whether to overwrite existing files</span><span class="delimiter">"</span></span> |
| argument <span class="key">name</span>:<span class="string"><span class="delimiter">'</span><span class="content">Domain Class</span><span class="delimiter">'</span></span>, <span class="key">description</span>:<span class="string"><span class="delimiter">'</span><span class="content">The name of the domain class</span><span class="delimiter">'</span></span> |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>As you can see this description profiles usage instructions, a flag and an argument. This allows the command to be used as follows:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails generate-all MyClass --force</code></pre> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_template_generation">Template Generation</h4> |
| <div class="paragraph"> |
| <p>Plugins and applications that need to define template generation tasks can do so using scripts. A example of this is the Scaffolding plugin which defines the <code>generate-all</code> and <code>generate-controllers</code> commands.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Every Grails script implements the <a href="https://grails.apache.org/docs/3.3.7/api/org/grails/cli/profile/commands/templates/TemplateRenderer.html">TemplateRenderer</a> interface which makes it trivial to render templates to the users project workspace.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The following is an example of the <a href="../ref/Command%20Line/create-script.html">create-script</a> command written in Groovy:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">description( <span class="string"><span class="delimiter">"</span><span class="content">Creates a Grails script</span><span class="delimiter">"</span></span> ) { |
| usage <span class="string"><span class="delimiter">"</span><span class="content">grails create-script <<SCRIPT NAME>></span><span class="delimiter">"</span></span> |
| argument <span class="key">name</span>:<span class="string"><span class="delimiter">'</span><span class="content">Script Name</span><span class="delimiter">'</span></span>, <span class="key">description</span>:<span class="string"><span class="delimiter">"</span><span class="content">The name of the script to create</span><span class="delimiter">"</span></span> |
| flag <span class="key">name</span>:<span class="string"><span class="delimiter">'</span><span class="content">force</span><span class="delimiter">'</span></span>, <span class="key">description</span>:<span class="string"><span class="delimiter">"</span><span class="content">Whether to overwrite existing files</span><span class="delimiter">"</span></span> |
| } |
| |
| <span class="keyword">def</span> scriptName = args[<span class="integer">0</span>] |
| <span class="keyword">def</span> model = model(scriptName) |
| <span class="keyword">def</span> overwrite = flag(<span class="string"><span class="delimiter">'</span><span class="content">force</span><span class="delimiter">'</span></span>) ? <span class="predefined-constant">true</span> : <span class="predefined-constant">false</span> |
| |
| render <span class="key">template</span>: template(<span class="string"><span class="delimiter">'</span><span class="content">artifacts/Script.groovy</span><span class="delimiter">'</span></span>), |
| <span class="key">destination</span>: file(<span class="string"><span class="delimiter">"</span><span class="content">src/main/scripts/</span><span class="inline"><span class="inline-delimiter">${</span>model.lowerCaseName<span class="inline-delimiter">}</span></span><span class="content">.groovy</span><span class="delimiter">"</span></span>), |
| <span class="key">model</span>: model, |
| <span class="key">overwrite</span>: overwrite</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If a script is defined in a plugin or profile, the <code>template(String)</code> method will search for the template in the application before using the template provided by your plugin or profile. This allows users of your plugin or profile to customize what gets generated.</p> |
| </div> |
| <div class="paragraph"> |
| <p>It is common to provide an easy way to allow users to copy the templates from your plugin or profile. Here is one example on how the angular scaffolding copies templates.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">templates(<span class="string"><span class="delimiter">"</span><span class="content">angular/**/*</span><span class="delimiter">"</span></span>).each { Resource r -> |
| <span class="predefined-type">String</span> path = r.URL.toString().replaceAll(<span class="regexp"><span class="delimiter">/</span><span class="content">^.*?META-INF</span><span class="delimiter">/</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">src/main</span><span class="delimiter">"</span></span>) |
| <span class="keyword">if</span> (path.endsWith(<span class="string"><span class="delimiter">'</span><span class="content">/</span><span class="delimiter">'</span></span>)) { |
| mkdir(path) |
| } <span class="keyword">else</span> { |
| <span class="predefined-type">File</span> to = <span class="keyword">new</span> <span class="predefined-type">File</span>(path) |
| SpringIOUtils.copy(r, to) |
| println(<span class="string"><span class="delimiter">"</span><span class="content">Copied </span><span class="inline"><span class="inline-delimiter">${</span>r.filename<span class="inline-delimiter">}</span></span><span class="content"> to location </span><span class="inline"><span class="inline-delimiter">${</span>to.canonicalPath<span class="inline-delimiter">}</span></span><span class="delimiter">"</span></span>) |
| } |
| }</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_the_model">The "model"</h4> |
| <div class="paragraph"> |
| <p>Executing the <code>model</code> method with a <code>Class</code>/<code>String</code>/<code>File</code>/<code>Resource</code> will return an instance of <a href="https://grails.apache.org/docs/3.3.7/api/grails/codegen/model/Model.html">Model</a>. The model contains several properties that can help you generate code.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> domain = model(com.foo.Bar) |
| |
| domain.className == <span class="string"><span class="delimiter">"</span><span class="content">FooBar</span><span class="delimiter">"</span></span> |
| domain.fullName == <span class="string"><span class="delimiter">"</span><span class="content">com.foo.FooBar</span><span class="delimiter">"</span></span> |
| domain.packageName == <span class="string"><span class="delimiter">"</span><span class="content">com.foo</span><span class="delimiter">"</span></span> |
| domain.packagePath == <span class="string"><span class="delimiter">"</span><span class="content">com/foo</span><span class="delimiter">"</span></span> |
| domain.propertyName == <span class="string"><span class="delimiter">"</span><span class="content">fooBar</span><span class="delimiter">"</span></span> |
| domain.lowerCaseName == <span class="string"><span class="delimiter">"</span><span class="content">foo-bar</span><span class="delimiter">"</span></span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>In addition, an <code>asMap</code> method is available to turn all of the properties into a map to pass to the <code>render</code> method.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_working_with_files">Working with files</h4> |
| <div class="paragraph"> |
| <p>All scripts have access to methods on the <a href="https://grails.apache.org/docs/3.3.7/api/org/grails/cli/profile/commands/io/FileSystemInteraction.html">FileSystemInteraction</a> class. It contains helpful methods to copy, delete, and create files.</p> |
| </div> |
| </div> |
| |
| |
| <h2 id="creatingCustomCommands">5.3 Creating Custom Commands</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/creatingCustomCommands.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>You can create your own commands by running the <a href="#ref-command-line-create-command">create-command</a> command from the root of your project. For example the following command will create a command called <code>grails-app/commands/HelloWorldCommand</code>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">grails create-command HelloWorld</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Unlike scripts, commands cause the Grails environment to start and you have full access to the application context and the runtime. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Since Grails 3.2.0, commands have similar abilities as scripts in regards to retrieving arguments, template generation, file access, and model building.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If you created a command in a previous version of grails, you can update your command to have those abilities by changing which trait you are implementing.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Commands created in Grails 3.1.x or lower implement the <a href="https://grails.apache.org/docs/latest/api/grails/dev/commands/ApplicationCommand.html">ApplicationCommand</a> trait by default which requires your command to implement the following method:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">boolean</span> handle(ExecutionContext executionContext)</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Commands created in Grails 3.2.0 or higher implement the <a href="https://grails.apache.org/docs/latest/api/grails/dev/commands/GrailsApplicationCommand.html">GrailsApplicationCommand</a> trait by default which requires your command to implement the following method:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">boolean</span> handle()</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Commands defined this way still have access to the execution context via a variable called "executionContext". |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Custom commands can be executed using <strong>grails run-command</strong>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code>grails run-command my-example</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Commands can also be executed using the <strong>runCommand</strong> gradle task. Note that the gradle task uses camelCase:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code>gradle runCommand -Pargs="my-example"</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>If the grails server is a subproject (e.g., in a project created with the <strong>angular</strong> profile), the subproject command can still be invoked from the gradle wrapper in the parent project:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code>./gradlew server:runCommand -Pargs="my-example"</code></pre> |
| </div> |
| </div> |
| |
| <a name="4.2 Re-using Grails scripts"><!-- Legacy link --></a> |
| <h2 id="reusingGrailsScripts">5.4 Re-using Grails scripts</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/reusingGrailsScripts.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>Grails ships with a lot of command line functionality out of the box that you may find useful in your own scripts (See the command line reference in the reference guide for info on all the commands).</p> |
| </div> |
| <div class="paragraph"> |
| <p>Any script you create can invoke another Grails script simply by invoking a method:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">testApp()</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The above will invoke the <code>test-app</code> command. You can also pass arguments using the method arguments:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">testApp(<span class="string"><span class="delimiter">'</span><span class="content">--debug-jvm</span><span class="delimiter">'</span></span>)</code></pre> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_invoking_gradle">Invoking Gradle</h4> |
| <div class="paragraph"> |
| <p>Instead of invoking another Grails CLI command you can invoke Gradle directory using the <code>gradle</code> property.</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">gradle.compileGroovy()</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_invoking_ant">Invoking Ant</h4> |
| <div class="paragraph"> |
| <p>You can also invoke Ant tasks from scripts which can help if you need to writing code generation and automation tasks:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">ant.mkdir(<span class="key">dir</span>:<span class="string"><span class="delimiter">"</span><span class="content">path</span><span class="delimiter">"</span></span>)</code></pre> |
| </div> |
| </div> |
| </div> |
| |
| |
| <h2 id="gradleBuild">5.5 Building with Gradle</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/gradleBuild.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>Grails 3.1 uses the <a href="http://gradle.org">Gradle Build System</a> for build related tasks such as compilation, runnings tests and producing binary distrubutions of your project. It is recommended to use Gradle 2.2 or above with Grails 3.1.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The build is defined by the <code>build.gradle</code> file which specifies the version of your project, the dependencies of the project and the repositories where to find those dependencies (amongst other things).</p> |
| </div> |
| <div class="paragraph"> |
| <p>When you invoke the <code>grails</code> command the version of Gradle that ships with Grails 3.1 (currently 2.9) is invoked by the <code>grails</code> process via the <a href="http://www.gradle.org/docs/current/userguide/embedding.html">Gradle Tooling API</a>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash"># Equivalent to 'gradle classes' |
| $ grails compile</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>You can invoke Gradle directly using the <code>gradle</code> command and use your own local version of Gradle, however you will need Gradle 2.2 or above to work with Grails 3.0:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">$ gradle assemble</code></pre> |
| </div> |
| </div> |
| |
| |
| <h2 id="gradleDependencies">5.5.1 Defining Dependencies with Gradle</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/gradleBuild/gradleDependencies.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>Dependencies for your project are defined in the <code>dependencies</code> block. In general you can follow the <a href="http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html">Gradle documentation on dependency management</a> to understand how to configure additional dependencies.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The default dependencies for the "web" profile can be seen below:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">dependencies { |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.springframework.boot:spring-boot-starter-logging</span><span class="delimiter">'</span></span> |
| compile(<span class="string"><span class="delimiter">'</span><span class="content">org.springframework.boot:spring-boot-starter-actuator</span><span class="delimiter">'</span></span>) |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.springframework.boot:spring-boot-autoconfigure</span><span class="delimiter">'</span></span> |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.springframework.boot:spring-boot-starter-tomcat</span><span class="delimiter">'</span></span> |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.grails:grails-dependencies</span><span class="delimiter">'</span></span> |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.grails:grails-web-boot</span><span class="delimiter">'</span></span> |
| |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.grails.plugins:hibernate</span><span class="delimiter">'</span></span> |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.grails.plugins:cache</span><span class="delimiter">'</span></span> |
| compile <span class="string"><span class="delimiter">'</span><span class="content">org.hibernate:hibernate-ehcache</span><span class="delimiter">'</span></span> |
| |
| runtime <span class="string"><span class="delimiter">'</span><span class="content">org.grails.plugins:asset-pipeline</span><span class="delimiter">'</span></span> |
| runtime <span class="string"><span class="delimiter">'</span><span class="content">org.grails.plugins:scaffolding</span><span class="delimiter">'</span></span> |
| |
| testCompile <span class="string"><span class="delimiter">'</span><span class="content">org.grails:grails-plugin-testing</span><span class="delimiter">'</span></span> |
| testCompile <span class="string"><span class="delimiter">'</span><span class="content">org.grails.plugins:geb</span><span class="delimiter">'</span></span> |
| |
| <span class="comment">// Note: It is recommended to update to a more robust driver (Chrome, Firefox etc.)</span> |
| testRuntime <span class="string"><span class="delimiter">'</span><span class="content">org.seleniumhq.selenium:selenium-htmlunit-driver:2.44.0</span><span class="delimiter">'</span></span> |
| |
| console <span class="string"><span class="delimiter">'</span><span class="content">org.grails:grails-console</span><span class="delimiter">'</span></span> |
| }</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Note that version numbers are not present in the majority of the dependencies. This is thanks to the dependency management plugin which configures a Maven BOM that defines the default dependency versions for certain commonly used dependencies and plugins:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">dependencyManagement { |
| imports { |
| mavenBom <span class="string"><span class="delimiter">'</span><span class="content">org.grails:grails-bom:</span><span class="delimiter">'</span></span> + grailsVersion |
| } |
| applyMavenExclusions <span class="predefined-constant">false</span> |
| }</code></pre> |
| </div> |
| </div> |
| |
| |
| <h2 id="gradleTasks">5.5.2 Working with Gradle Tasks</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/gradleBuild/gradleTasks.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>As mentioned previously the <code>grails</code> command uses an embedded version of Gradle and certain Grails commands that existed in previous versions of Grails map onto their Gradle equivalents. The following table shows which Grails command invoke which Gradle task:</p> |
| </div> |
| <table class="tableblock frame-all grid-all spread"> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Grails Command</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Gradle Task</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">clean</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">clean</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">compile</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">classes</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">package</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">assemble</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">run-app</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">bootRun</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">test-app</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">test</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">test-app --integration</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">integrationTest</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">war</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">assemble</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>You can invoke any of these Grails commands using their Gradle equivalents if you prefer:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">$ gradle test</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Note however that you will need to use a version of Gradle compatible with Grails 3.1 (Gradle 2.2 or above). If you wish to invoke a Gradle task using the version of Gradle used by Grails you can do so with the <code>grails</code> command:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">$ grails gradle compileGroovy</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>However, it is recommended you do this via interactive mode, as it greatly speeds up execution and provides TAB completion for the available Gradle tasks:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">$ grails |
| | Enter a command name to run. Use TAB for completion: |
| grails> gradle compileGroovy |
| ...</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>To find out what Gradle tasks are available without using interactive mode TAB completion you can use the Gradle <code>tasks</code> task:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="bash">gradle tasks</code></pre> |
| </div> |
| </div> |
| |
| |
| <h2 id="gradlePlugins">5.5.3 Grails plugins for Gradle</h2> |
| |
| <div class='contribute-btn'> |
| <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/3.3.x/src/en/guide/commandLine/gradleBuild/gradlePlugins.adoc"'> |
| <i class='fa fa-pencil-square-o'></i> Improve this doc |
| </button> |
| </div> |
| |
| |
| <div class="paragraph"> |
| <p>When you create a new project with the <a href="../ref/Command%20Line/create-app.html">create-app</a> command, a default <code>build.gradle</code> is created. The default <code>build.gradle</code> configures the build with a set of Gradle plugins that allow Gradle to build the Grails project:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="groovy">apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">"</span><span class="content">war</span><span class="delimiter">"</span></span> |
| apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">"</span><span class="content">org.grails.grails-web</span><span class="delimiter">"</span></span> |
| apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">"</span><span class="content">org.grails.grails-gsp</span><span class="delimiter">"</span></span> |
| apply <span class="key">plugin</span>:<span class="string"><span class="delimiter">"</span><span class="content">asset-pipeline</span><span class="delimiter">"</span></span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The default plugins are as follows:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>war</code> - The <a href="http://www.gradle.org/docs/current/userguide/war_plugin.html">WAR plugin</a> changes the packaging so that Gradle creates as WAR file from your application. You can comment out this plugin if you wish to create only a runnable JAR file for standalone deployment.</p> |
| </li> |
| <li> |
| <p><code>asset-pipeline</code> - The <a href="https://grails.org/plugins.html#plugin/asset-pipeline">asset pipeline</a> plugin enables the compilation of static assets (JavaScript, CSS etc.)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Many of these are built in plugins provided by Gradle or third party plugins. The Gradle plugins that Grails provides are as follows:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>org.grails.grails-core</code> - The primary Grails plugin for Gradle, included by all other plugins and designed to operate with all profiles.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-gsp</code> - The Grails GSP plugin adds precompilation of GSP files for production deployments.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-doc</code> - A plugin for Gradle for using Grails 2.0’s documentation engine.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-plugin</code> - A plugin for Gradle for building Grails plugins.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-plugin-publish</code> - A plugin for publishing Grails plugins to the central repository.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-profile</code> - A plugin for use when creating Grails <a href="#profiles">Profiles</a>.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-profile-publish</code> - A plugin for publishing Grails profiles to the central repository.</p> |
| </li> |
| <li> |
| <p><code>org.grails.grails-web</code> - The Grails Web gradle plugin configures Gradle to understand the Grails conventions and directory structure.</p> |
| </li> |
| </ul> |
| </div> |
| |
| |
| <div style="clear:both;margin-top:15px;"></div> |
| |
| <div class="toc-item prev-left"><a href="../guide/conf.html"><< <strong>4</strong><span>Configuration</span></a></div> |
| |
| <div class="toc-item next-right"><a href="../guide/profiles.html"><strong>6</strong><span>Application Profiles</span> >></a></div> |
| |
| <div style="clear:both"></div> |
| </div> |
| </td> |
| <td id="col2"> |
| <div class="local clearfix"> |
| <div class="local-title"> |
| <a href="../guide/index.html" target="mainFrame">Quick Reference</a> |
| <span class="toggle">(<a href="#" onclick="localToggle(); return false;">hide</a>)</span> |
| </div> |
| <div class="menu"> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Command Line</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/bug-report.html">bug-report</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/clean.html">clean</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/compile.html">compile</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/console.html">console</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-app.html">create-app</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-command.html">create-command</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-controller.html">create-controller</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-domain-class.html">create-domain-class</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-functional-test.html">create-functional-test</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-hibernate-cfg-xml.html">create-hibernate-cfg-xml</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-integration-test.html">create-integration-test</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-interceptor.html">create-interceptor</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-plugin.html">create-plugin</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-profile.html">create-profile</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-script.html">create-script</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-service.html">create-service</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-taglib.html">create-taglib</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/create-unit-test.html">create-unit-test</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/dependency-report.html">dependency-report</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/docs.html">docs</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/generate-all.html">generate-all</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/generate-controller.html">generate-controller</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/generate-views.html">generate-views</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/help.html">help</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/install-templates.html">install-templates</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/list-plugins.html">list-plugins</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/list-profiles.html">list-profiles</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/package-plugin.html">package-plugin</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/package.html">package</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/plugin-info.html">plugin-info</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/profile-info.html">profile-info</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/run-app.html">run-app</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/run-command.html">run-command</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/run-script.html">run-script</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/schema-export.html">schema-export</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/shell.html">shell</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/stats.html">stats</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/stop-app.html">stop-app</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/test-app.html">test-app</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Command%20Line/war.html">war</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Constraints</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Constraints/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Constraints/attributes.html">attributes</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/bindable.html">bindable</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/blank.html">blank</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/creditCard.html">creditCard</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/email.html">email</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/inList.html">inList</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/matches.html">matches</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/max.html">max</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/maxSize.html">maxSize</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/min.html">min</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/minSize.html">minSize</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/notEqual.html">notEqual</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/nullable.html">nullable</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/range.html">range</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/scale.html">scale</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/size.html">size</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/unique.html">unique</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/url.html">url</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/validator.html">validator</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Constraints/widget.html">widget</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Controllers</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Controllers/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Controllers/actionName.html">actionName</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/allowedMethods.html">allowedMethods</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/bindData.html">bindData</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/chain.html">chain</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/controllerName.html">controllerName</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/defaultAction.html">defaultAction</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/errors.html">errors</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/flash.html">flash</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/forward.html">forward</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/grailsApplication.html">grailsApplication</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/hasErrors.html">hasErrors</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/namespace.html">namespace</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/params.html">params</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/redirect.html">redirect</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/render.html">render</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/request.html">request</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/respond.html">respond</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/response.html">response</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/responseFormats.html">responseFormats</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/scope.html">scope</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/servletContext.html">servletContext</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/session.html">session</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/withForm.html">withForm</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Controllers/withFormat.html">withFormat</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Database Mapping</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/autoImport.html">autoImport</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/autoTimestamp.html">autoTimestamp</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/batchSize.html">batchSize</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/cache.html">cache</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/cascade.html">cascade</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/column.html">column</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/comment.html">comment</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/discriminator.html">discriminator</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/dynamicInsert.html">dynamicInsert</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/dynamicUpdate.html">dynamicUpdate</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/fetch.html">fetch</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/id.html">id</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/ignoreNotFound.html">ignoreNotFound</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/indexColumn.html">indexColumn</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/insertable.html">insertable</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/joinTable.html">joinTable</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/lazy.html">lazy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/order.html">order</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/sort.html">sort</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/table.html">table</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/type.html">type</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/updateable.html">updateable</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Database%20Mapping/version.html">version</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Domain Classes</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/addTo.html">addTo</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/attach.html">attach</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/belongsTo.html">belongsTo</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/clearErrors.html">clearErrors</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/constraints.html">constraints</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/count.html">count</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/countBy.html">countBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/createCriteria.html">createCriteria</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/delete.html">delete</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/discard.html">discard</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/embedded.html">embedded</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/errors.html">errors</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/executeQuery.html">executeQuery</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/executeUpdate.html">executeUpdate</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/exists.html">exists</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/fetchMode.html">fetchMode</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/find.html">find</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findAll.html">findAll</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findAllBy.html">findAllBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findAllWhere.html">findAllWhere</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findBy.html">findBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateBy.html">findOrCreateBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateWhere.html">findOrCreateWhere</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveBy.html">findOrSaveBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveWhere.html">findOrSaveWhere</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/findWhere.html">findWhere</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/first.html">first</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/get.html">get</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/getAll.html">getAll</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/getDirtyPropertyNames.html">getDirtyPropertyNames</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/getPersistentValue.html">getPersistentValue</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/hasErrors.html">hasErrors</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/hasMany.html">hasMany</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/hasOne.html">hasOne</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/ident.html">ident</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/instanceOf.html">instanceOf</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/isAttached.html">isAttached</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/isDirty.html">isDirty</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/last.html">last</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/list.html">list</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/listOrderBy.html">listOrderBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/load.html">load</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/lock.html">lock</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/mapWith.html">mapWith</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/mappedBy.html">mappedBy</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/mapping.html">mapping</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/merge.html">merge</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/namedQueries.html">namedQueries</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/properties.html">properties</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/read.html">read</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/refresh.html">refresh</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/removeFrom.html">removeFrom</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/save.html">save</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/transients.html">transients</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/validate.html">validate</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/where.html">where</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/whereAny.html">whereAny</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/withCriteria.html">withCriteria</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/withNewSession.html">withNewSession</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/withSession.html">withSession</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Domain%20Classes/withTransaction.html">withTransaction</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Plug-ins</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/URL%20mappings.html">URL mappings</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/codecs.html">codecs</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/controllers.html">controllers</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/core.html">core</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/dataSource.html">dataSource</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/domainClasses.html">domainClasses</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/hibernate.html">hibernate</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/i18n.html">i18n</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/logging.html">logging</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/scaffolding.html">scaffolding</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/services.html">services</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Plug-ins/servlets.html">servlets</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Services</h1><div class="menu-sub"> |
| |
| <div class="menu-item"><a href="../ref/Services/Usage.html">Usage</a></div> |
| |
| |
| <div class="menu-item"><a href="../ref/Services/scope.html">scope</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Services/transactional.html">transactional</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| <div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Servlet API</h1><div class="menu-sub"> |
| |
| |
| <div class="menu-item"><a href="../ref/Servlet%20API/request.html">request</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Servlet%20API/response.html">response</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Servlet%20API/servletContext.html">servletContext</a> |
| </div> |
| |
| <div class="menu-item"><a href="../ref/Servlet%20API/session.html">session</a> |
| </div> |
| |
| </div> |
| </div> |
| |
| </div> |
| </div> |
| </td> |
| </tr> |
| </table> |
| |
| <div id="footer"> |
| Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. |
| |
| </div> |
| |
| <script type="text/javascript" src="../js/docs.js"></script> |
| |
| </body> |
| </html> |