You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2016/05/26 11:16:47 UTC
[9/9] isis-site git commit: ISIS-1413: live reload and other useful
gradle scripts
ISIS-1413: live reload and other useful gradle scripts
Project: http://git-wip-us.apache.org/repos/asf/isis-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis-site/commit/c0266bf8
Tree: http://git-wip-us.apache.org/repos/asf/isis-site/tree/c0266bf8
Diff: http://git-wip-us.apache.org/repos/asf/isis-site/diff/c0266bf8
Branch: refs/heads/asf-site
Commit: c0266bf8f7fbc0eed801e53809600f840047877c
Parents: 44ddd88
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 26 12:03:35 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 26 12:15:32 2016 +0100
----------------------------------------------------------------------
content/guides/dg.html | 259 +-
content/guides/dg.pdf | 14656 +++++++++++------
.../070-advanced/002-compiler-exclude.png | Bin 0 -> 31775 bytes
.../070-advanced/004-gradle-output.png | Bin 0 -> 23091 bytes
.../070-advanced/005-gradle-output.png | Bin 0 -> 30890 bytes
.../070-advanced/006-livereload-js.png | Bin 0 -> 80581 bytes
content/guides/rgcfg.html | 7 +-
content/guides/rgcfg.pdf | 2338 ++-
content/guides/rgsvc.html | 13 +-
content/guides/rgsvc.pdf | 6163 +++----
content/guides/ugvw.html | 9 +
content/guides/ugvw.pdf | 3916 ++---
12 files changed, 16246 insertions(+), 11115 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis-site/blob/c0266bf8/content/guides/dg.html
----------------------------------------------------------------------
diff --git a/content/guides/dg.html b/content/guides/dg.html
index bbe934e..50a6a5f 100644
--- a/content/guides/dg.html
+++ b/content/guides/dg.html
@@ -623,12 +623,12 @@ as Jenkins)</p>
<p>This section describes how to install and setup JetBrains' IntelliJ IDEA, then how to import an application into IntelliJ and run it.</p>
</div>
<div class="sect3">
-<h4 id="_installing_and_setting_up">2.1.1. Installing and Setting up</h4>
+<h4 id="_dg_ide_intellij_installing">2.1.1. Installing and Setting up</h4>
<div class="paragraph">
<p>This section covers installation and setup. These notes/screenshots were prepared using IntelliJ Community Edition 14.1.x, but are believed to be compatible with more recent versions/other editions of the IDE.</p>
</div>
<div class="sect4">
-<h5 id="_download_and_install">Download and Install</h5>
+<h5 id="_dg_ide_intellij_installing_download">Download and Install</h5>
<div class="paragraph">
<p><a href="https://www.jetbrains.com/idea/download/">Download</a> latest version of IntelliJ Community Edition, and install:</p>
</div>
@@ -697,7 +697,7 @@ as Jenkins)</p>
</div>
</div>
<div class="sect4">
-<h5 id="_new_project">New Project</h5>
+<h5 id="_dg_ide_intellij_installing_new-project">New Project</h5>
<div class="paragraph">
<p>In IntelliJ a project can contain multiple modules; these need not be physically located together. (If you are previously an Eclipse user, you can think of it as similar to an Eclipse workspace).</p>
</div>
@@ -931,7 +931,7 @@ for frameworks such as <a href="#_cg_ide_project-lombok">Project Lombok</a>.</p>
</div>
</div>
<div class="sect3">
-<h4 id="_importing_maven_modules">2.1.2. Importing Maven Modules</h4>
+<h4 id="_dg_ide_intellij_importing-maven-modules">2.1.2. Importing Maven Modules</h4>
<div class="paragraph">
<p>Let’s load in some actual code! We do this by importing the Maven modules.</p>
</div>
@@ -997,12 +997,12 @@ for frameworks such as <a href="#_cg_ide_project-lombok">Project Lombok</a>.</p>
</div>
</div>
<div class="sect3">
-<h4 id="_running">2.1.3. Running</h4>
+<h4 id="_dg_ide_intellij_running">2.1.3. Running</h4>
<div class="paragraph">
<p>Let’s see how to run both the app and the tests.</p>
</div>
<div class="sect4">
-<h5 id="_running_the_app">Running the App</h5>
+<h5 id="_dg_ide_intellij_running_the-app">Running the App</h5>
<div class="paragraph">
<p>Once you’ve imported your Isis application, we should run it. We do this by creating a Run configuration, using <code>Run > Edit Configurations</code>.</p>
</div>
@@ -1050,7 +1050,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_running_the_unit_tests">Running the Unit Tests</h5>
+<h5 id="_dg_ide_intellij_running_unit-tests">Running the Unit Tests</h5>
<div class="paragraph">
<p>The easiest way to run the unit tests is just to right click on the <code>dom</code> module in the <em>Project Window</em>, and choose run unit tests. Hopefully your tests will pass (!).</p>
</div>
@@ -1074,7 +1074,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_running_the_integration_tests">Running the Integration Tests</h5>
+<h5 id="_dg_ide_intellij_running_integ-tests">Running the Integration Tests</h5>
<div class="paragraph">
<p>Integration tests can be run in the same way as unit tests, however the <code>dom</code> module must also have been enhanced.</p>
</div>
@@ -1087,12 +1087,23 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
<div class="title">Figure 31. IntelliJ Running the App - Integration Tests Run Configuration</div>
</div>
+<div class="paragraph">
+<p>Also make sure that the <code>search for tests</code> radio button is set to <code>In single module</code>:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images/appendices/dev-env/intellij-idea/400-running-integtests/run-debug-configuration-single-module.png"><img src="images/appendices/dev-env/intellij-idea/400-running-integtests/run-debug-configuration-single-module.png" alt="run debug configuration single module" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>If this radio button is set to one of the other options then you may obtain class loading issues; these result from IntelliJ attempting to run unit tests of the <code>dom</code> project that depend on test classes in that module, but using the classpath of the <code>integtests</code> module whereby the <code>dom</code> test-classes (<code>test-jar</code> artifact) are not exposed on the Maven classpath.</p>
+</div>
</div>
</div>
<div class="sect3">
-<h4 id="_hints_and_tips">2.1.4. Hints and Tips</h4>
+<h4 id="_dg_ide_intellij_hints-and-tips">2.1.4. Hints and Tips</h4>
<div class="sect4">
-<h5 id="_keyboard_cheat_sheets">Keyboard Cheat Sheets</h5>
+<h5 id="_dg_ide_intellij_hints-and-tips_keyboard-cheat-sheets">Keyboard Cheat Sheets</h5>
<div class="paragraph">
<p>You can download 1-page PDFs cheat sheets for IntelliJ’s keyboard shortcuts:
* for <a href="https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard.pdf">Windows</a>
@@ -1147,7 +1158,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_navigating_around">Navigating Around</h5>
+<h5 id="_dg_ide_intellij_hints-and-tips_navigating-around">Navigating Around</h5>
<div class="paragraph">
<p>For all of the following, you don’t need to type every letter, typing "ab" will actually search for ".<strong>a.*b.</strong>".</p>
</div>
@@ -1190,7 +1201,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_editing">Editing</h5>
+<h5 id="_dg_ide_intellij_hints-and-tips_editing">Editing</h5>
<div class="ulist">
<ul>
<li>
@@ -1255,7 +1266,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_refactoring">Refactoring</h5>
+<h5 id="_dg_ide_intellij_hints-and-tips_refactoring">Refactoring</h5>
<div class="paragraph">
<p>Loads of good stuff on the <code>Refactor</code> menu; most used are:</p>
</div>
@@ -1290,7 +1301,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_plugins">Plugins</h5>
+<h5 id="_dg_ide_intellij_hints-and-tips_plugins">Plugins</h5>
<div class="paragraph">
<p>You might want to set up some additional plugins. You can do this using <code>File > Settings > Plugins</code> (or equivalently <code>File > Other Settings > Configure Plugins</code>).</p>
</div>
@@ -1323,7 +1334,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
<div class="title">Figure 32. IntelliJ Plugins</div>
</div>
<div class="sect5">
-<h6 id="_maven_helper_plugin">Maven Helper Plugin</h6>
+<h6 id="_dg_ide_intellij_hints-and-tips_plugins_maven-helper-plugin">Maven Helper Plugin</h6>
<div class="paragraph">
<p>This plugin provides a couple of great features. One is better visualization of dependency trees (similar to Eclipse).</p>
</div>
@@ -1362,7 +1373,7 @@ if you forget to set up the enhancer goal, or don’t run it on the correct
</div>
</div>
<div class="sect4">
-<h5 id="_troubleshooting">Troubleshooting</h5>
+<h5 id="_dg_ide_intellij_troubleshooting">Troubleshooting</h5>
<div class="paragraph">
<p>When a Maven module is imported, IntelliJ generates its own project files (suffix <code>.ipr</code>), and the application is actually built from that.</p>
</div>
@@ -1396,26 +1407,181 @@ are set up correctly.</p>
</div>
</div>
<div class="sect3">
-<h4 id="_running_integration_tests">2.1.5. Running Integration Tests</h4>
+<h4 id="_dg_ide_intellij_advanced">2.1.5. Faster turnaround times</h4>
+<div class="paragraph">
+<p>In this section are several options that will reduce the time it takes between making a source code edit and seeing the results in the running app. code/build/deploy/review feedback loop.</p>
+</div>
+<div class="sect4">
+<h5 id="_dg_ide_intellij_advanced_gradle-compile-enhance">Using Grade to compile/enhance</h5>
<div class="paragraph">
-<p>When running integration tests from within IntelliJ, make sure that the <code>search for tests</code> radio button is set to <code>In single module</code>:</p>
+<p>Running an Apache Isis application requires that the DataNucleus enhancer runs on the compiled bytecode. As described <a href="#_dg_ide_intellij_running_the-app">above</a>, the recommended way to do this with IntelliJ is to use a Run configuration that runs the enhancer goal prior to launch.</p>
+</div>
+<div class="paragraph">
+<p>Alternative, you can use the following <code>build.gradle</code> script in your <code>dom</code> module:</p>
+</div>
+<div class="listingblock">
+<div class="title"><code>build.gradle</code></div>
+<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">java</span><span class="delimiter">'</span></span>
+apply <span class="key">plugin</span>: <span class="string"><span class="delimiter">'</span><span class="content">tangram.tools</span><span class="delimiter">'</span></span>
+sourceCompatibility = <span class="float">1.8</span>
+targetCompatibility = <span class="float">1.8</span>
+version = (<span class="keyword">new</span> XmlParser()).parse(<span class="string"><span class="delimiter">'</span><span class="content">pom.xml</span><span class="delimiter">'</span></span>).parent.version.text()
+buildscript {
+ repositories {
+ maven { url <span class="string"><span class="delimiter">"</span><span class="content">http://oss.jfrog.org/artifactory/oss-snapshot-local</span><span class="delimiter">"</span></span> }
+ jcenter()
+ }
+ dependencies {
+ classpath <span class="string"><span class="delimiter">'</span><span class="content">tangram:gradle-plugin:1.1.2</span><span class="delimiter">'</span></span>
+ }
+}
+repositories {
+ mavenLocal()
+ maven { url <span class="string"><span class="delimiter">"</span><span class="content">http://oss.jfrog.org/artifactory/oss-snapshot-local</span><span class="delimiter">"</span></span> }
+ jcenter()
+}
+dependencies {
+ compile <span class="key">group</span>: <span class="string"><span class="delimiter">'</span><span class="content">org.apache.isis.core</span><span class="delimiter">'</span></span>, <span class="key">name</span>: <span class="string"><span class="delimiter">'</span><span class="content">isis-core-applib</span><span class="delimiter">'</span></span>, <span class="key">version</span>: version
+}
+task copyClasses << {
+ copy {
+ from <span class="string"><span class="delimiter">'</span><span class="content">build/classes/main</span><span class="delimiter">'</span></span>
+ into <span class="string"><span class="delimiter">'</span><span class="content">target/classes</span><span class="delimiter">'</span></span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The script is intended to be in the background as a daemon while editing/developing; whenever a change is made to any
+source code, gradle will automatically compile <em>and</em> enhance the code. In this way it eliminates the need to start up
+Maven and run the enhancer goal.</p>
+</div>
+<div class="paragraph">
+<p>To use, you must disable the IntelliJ’s automatic building of the 'dom' project. This is done using:
+<code>File > Settings > Build, Execution, Deployment > Compiler > Excludes</code>, and then exclude the <code>…​/dom/src/main/java</code>
+directory:</p>
</div>
<div class="imageblock">
<div class="content">
-<a class="image" href="images/appendices/dev-env/intellij-idea/400-running-integtests/run-debug-configuration-single-module.png"><img src="images/appendices/dev-env/intellij-idea/400-running-integtests/run-debug-configuration-single-module.png" alt="run debug configuration single module" width="600px"></a>
+<a class="image" href="images/appendices/dev-env/intellij-idea/070-advanced/002-compiler-exclude.png"><img src="images/appendices/dev-env/intellij-idea/070-advanced/002-compiler-exclude.png" alt="002 compiler exclude" width="800px"></a>
</div>
</div>
<div class="paragraph">
-<p>If this radio button is set to one of the other options then you may obtain class loading issues; these result from IntelliJ attempting to run unit tests of the <code>dom</code> project that depend on test classes in that module, but using the classpath of the <code>integtests</code> module whereby the <code>dom</code> test-classes (<code>test-jar</code> artifact) are not exposed on the Maven classpath.</p>
+<p>The script can be run in the background using:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="bash">gradle -t --offline &</code></pre>
</div>
</div>
-<div class="sect3">
-<h4 id="_dg_ide_intellij_advanced">2.1.6. Advanced</h4>
<div class="paragraph">
-<p>In this section are a couple of options that will reduce the length of the change code/build/deploy/review feedback loop.</p>
+<p>from the command line (in the <code>dom</code> module).</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images/appendices/dev-env/intellij-idea/070-advanced/004-gradle-output.png"><img src="images/appendices/dev-env/intellij-idea/070-advanced/004-gradle-output.png" alt="004 gradle output" width="600px"></a>
+</div>
+</div>
+</div>
+<div class="sect4">
+<h5 id="_dg_ide_intellij_advanced_gradle-liveReload">Using Grade for liveReload</h5>
+<div class="paragraph">
+<p>Similarly, gradle can be run to reduce the turn-around time when tweaking the UI (defined by the
+ <a href="ugfun.html#_ugfun_object-layout_dynamic_xml"><code>*.layout.xml</code></a> file for each domain class), when the app is running.</p>
+</div>
+<div class="paragraph">
+<p>The framework will automatically notice any changes to <code>.layout.xml</code> files, but these are read from the
+the classpath (the <code>target/classes</code> directory), not the source path. With IntelliJ these can be copied over manually
+by invoking <code>Run > Reload Changed Classes</code>. Once the browser is refreshed, the new layout will be rendered.</p>
+</div>
+<div class="paragraph">
+<p>To reduce the turn-around time there are therefore two steps to be automated:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the copying of the <code>.layout.xml</code> files over to the <code>target/classes</code> directory</p>
+</li>
+<li>
+<p>the triggering of a page refresh by the browser.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>The <code>layouts.gradle</code> script takes care of the first of these; whenever a change is made to any <code>.layout.xml</code> file, gradle
+will automatically copy over the file to the <code>target/classes</code> directory:</p>
+</div>
+<div class="listingblock">
+<div class="title"><code>layouts.gradle</code></div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">defaultTasks <span class="string"><span class="delimiter">'</span><span class="content">copyLayouts</span><span class="delimiter">'</span></span>
+task copyLayouts(<span class="key">type</span>:Copy) {
+ from <span class="string"><span class="delimiter">'</span><span class="content">src/main/java</span><span class="delimiter">'</span></span>
+ into <span class="string"><span class="delimiter">'</span><span class="content">target/classes</span><span class="delimiter">'</span></span>
+ include <span class="string"><span class="delimiter">'</span><span class="content">**/*.layout.xml</span><span class="delimiter">'</span></span>
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Similarly, the <code>liveReload.gradle</code> script takes care of the browser refresh:</p>
+</div>
+<div class="listingblock">
+<div class="title"><code>liveReload.gradle</code></div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">defaultTasks <span class="string"><span class="delimiter">'</span><span class="content">liveReload</span><span class="delimiter">'</span></span>
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath <span class="string"><span class="delimiter">'</span><span class="content">org.kordamp.gradle:livereload-gradle-plugin:0.2.1</span><span class="delimiter">'</span></span>
+ }
+}
+apply <span class="key">plugin</span>: <span class="string"><span class="delimiter">'</span><span class="content">org.kordamp.gradle.livereload</span><span class="delimiter">'</span></span>
+liveReload {
+ docRoot <span class="keyword">new</span> <span class="predefined-type">File</span>(<span class="string"><span class="delimiter">'</span><span class="content">target/classes</span><span class="delimiter">'</span></span>).canonicalPath
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>These scripts can be run together using:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="bash">gradle -t --offline -b layouts.gradle &
+gradle -t --offline -b liveReload.gradle &</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>from the command line (in the <code>dom</code> module):</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images/appendices/dev-env/intellij-idea/070-advanced/005-gradle-output.png"><img src="images/appendices/dev-env/intellij-idea/070-advanced/005-gradle-output.png" alt="005 gradle output" width="600px"></a>
+</div>
+</div>
+<div class="paragraph">
+<p>Live reload also requires that the <code>isis.viewer.wicket.liveReloadUrl</code> configuration property (<code>1.13.0-SNAPSHOT</code>) is set
+appropriately:</p>
+</div>
+<div class="listingblock">
+<div class="title"><code>viewer_wicket.properties</code></div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="ini">isis.viewer.wicket.liveReloadUrl=http://localhost:35729/livereload.js?snipver=1</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>You can confirm the script is loaded correctly using the web browser’s development tools, eg:</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<a class="image" href="images/appendices/dev-env/intellij-idea/070-advanced/006-livereload-js.png"><img src="images/appendices/dev-env/intellij-idea/070-advanced/006-livereload-js.png" alt="006 livereload js" width="800px"></a>
+</div>
+</div>
</div>
<div class="sect4">
-<h5 id="_dg_ide_intellij_advanced_dcevm">Setting up Dynamic Reloading</h5>
+<h5 id="_dg_ide_intellij_advanced_dcevm">Setting up DCEVM</h5>
<div class="paragraph">
<p><a href="github.com/dcevm/dcevm">DCEVM</a> enhances the JVM with true hot-swap adding/removing of methods as well as more
reliable hot swapping of the implementation of existing methods.</p>
@@ -1681,7 +1847,7 @@ application into Eclipse and configure to use with the JDO Objectstore.</p>
</div>
</div>
<div class="sect3">
-<h4 id="_running_the_app_2">2.2.5. Running the App</h4>
+<h4 id="_running_the_app">2.2.5. Running the App</h4>
<div class="paragraph">
<p>The simpleapp archetype automatically provides a <code>.launch</code> configurations in the <code>webapp</code> module. You can therefore very simply run the application by right-clicking on one of these files, and choosing "Run As\u2026" or "Debug As\u2026".</p>
</div>
@@ -1718,7 +1884,7 @@ application into Eclipse and configure to use with the JDO Objectstore.</p>
<p>In this section are a couple of options that will reduce the length of the change code/build/deploy/review feedback loop.</p>
</div>
<div class="sect4">
-<h5 id="_setting_up_dynamic_reloading">Setting up Dynamic Reloading</h5>
+<h5 id="_setting_up_dcevm">Setting up DCEVM</h5>
<div class="paragraph">
<p><a href="github.com/dcevm/dcevm">DCEVM</a> enhances the JVM with true hot-swap adding/removing of methods as well as more
reliable hot swapping of the implementation of existing methods.</p>
@@ -4149,10 +4315,10 @@ hide method lines</code></pre>
<ul class="sectlevel2">
<li><a href="#_dg_ide_intellij">2.1. Developing using IntelliJ IDEA</a>
<ul class="sectlevel3">
-<li><a href="#_installing_and_setting_up">2.1.1. Installing and Setting up</a>
+<li><a href="#_dg_ide_intellij_installing">2.1.1. Installing and Setting up</a>
<ul class="sectlevel4">
-<li><a href="#_download_and_install">Download and Install</a></li>
-<li><a href="#_new_project">New Project</a></li>
+<li><a href="#_dg_ide_intellij_installing_download">Download and Install</a></li>
+<li><a href="#_dg_ide_intellij_installing_new-project">New Project</a></li>
<li><a href="#_dg_ide_intellij_file-templates">File templates</a></li>
<li><a href="#_dg_ide_intellij_live-templates">Live templates</a></li>
<li><a href="#_dg_ide_intellij_coding-standards">Coding Standards</a></li>
@@ -4161,30 +4327,31 @@ hide method lines</code></pre>
<li><a href="#_other_settings_misc">Other Settings (Misc)</a></li>
</ul>
</li>
-<li><a href="#_importing_maven_modules">2.1.2. Importing Maven Modules</a></li>
-<li><a href="#_running">2.1.3. Running</a>
+<li><a href="#_dg_ide_intellij_importing-maven-modules">2.1.2. Importing Maven Modules</a></li>
+<li><a href="#_dg_ide_intellij_running">2.1.3. Running</a>
<ul class="sectlevel4">
-<li><a href="#_running_the_app">Running the App</a></li>
-<li><a href="#_running_the_unit_tests">Running the Unit Tests</a></li>
-<li><a href="#_running_the_integration_tests">Running the Integration Tests</a></li>
+<li><a href="#_dg_ide_intellij_running_the-app">Running the App</a></li>
+<li><a href="#_dg_ide_intellij_running_unit-tests">Running the Unit Tests</a></li>
+<li><a href="#_dg_ide_intellij_running_integ-tests">Running the Integration Tests</a></li>
</ul>
</li>
-<li><a href="#_hints_and_tips">2.1.4. Hints and Tips</a>
+<li><a href="#_dg_ide_intellij_hints-and-tips">2.1.4. Hints and Tips</a>
<ul class="sectlevel4">
-<li><a href="#_keyboard_cheat_sheets">Keyboard Cheat Sheets</a></li>
+<li><a href="#_dg_ide_intellij_hints-and-tips_keyboard-cheat-sheets">Keyboard Cheat Sheets</a></li>
<li><a href="#_switch_between_tools_editors">Switch between Tools & Editors</a></li>
-<li><a href="#_navigating_around">Navigating Around</a></li>
-<li><a href="#_editing">Editing</a></li>
+<li><a href="#_dg_ide_intellij_hints-and-tips_navigating-around">Navigating Around</a></li>
+<li><a href="#_dg_ide_intellij_hints-and-tips_editing">Editing</a></li>
<li><a href="#_intentions_and_code_completion">Intentions and Code Completion</a></li>
-<li><a href="#_refactoring">Refactoring</a></li>
-<li><a href="#_plugins">Plugins</a></li>
-<li><a href="#_troubleshooting">Troubleshooting</a></li>
+<li><a href="#_dg_ide_intellij_hints-and-tips_refactoring">Refactoring</a></li>
+<li><a href="#_dg_ide_intellij_hints-and-tips_plugins">Plugins</a></li>
+<li><a href="#_dg_ide_intellij_troubleshooting">Troubleshooting</a></li>
</ul>
</li>
-<li><a href="#_running_integration_tests">2.1.5. Running Integration Tests</a></li>
-<li><a href="#_dg_ide_intellij_advanced">2.1.6. Advanced</a>
+<li><a href="#_dg_ide_intellij_advanced">2.1.5. Faster turnaround times</a>
<ul class="sectlevel4">
-<li><a href="#_dg_ide_intellij_advanced_dcevm">Setting up Dynamic Reloading</a></li>
+<li><a href="#_dg_ide_intellij_advanced_gradle-compile-enhance">Using Grade to compile/enhance</a></li>
+<li><a href="#_dg_ide_intellij_advanced_gradle-liveReload">Using Grade for liveReload</a></li>
+<li><a href="#_dg_ide_intellij_advanced_dcevm">Setting up DCEVM</a></li>
<li><a href="#_setting_up_jrebel">Setting up JRebel</a></li>
</ul>
</li>
@@ -4202,11 +4369,11 @@ hide method lines</code></pre>
<li><a href="#_workaround_if_the_enhancer_fails">Workaround: If the enhancer fails</a></li>
</ul>
</li>
-<li><a href="#_running_the_app_2">2.2.5. Running the App</a></li>
+<li><a href="#_running_the_app">2.2.5. Running the App</a></li>
<li><a href="#_other_domain_projects">2.2.6. Other domain projects.</a></li>
<li><a href="#_advanced">2.2.7. Advanced</a>
<ul class="sectlevel4">
-<li><a href="#_setting_up_dynamic_reloading">Setting up Dynamic Reloading</a></li>
+<li><a href="#_setting_up_dcevm">Setting up DCEVM</a></li>
</ul>
</li>
</ul>