- •1.1. About this user guide
- •2.1. Features
- •2.2. Why Groovy?
- •3.1. Getting Started
- •4.1. Prerequisites
- •4.2. Download
- •4.3. Unpacking
- •4.4. Environment variables
- •4.5. Running and testing your installation
- •4.6. JVM options
- •5.1. Working through problems
- •5.2. Getting help
- •6.1. Projects and tasks
- •6.2. Hello world
- •6.3. A shortcut task definition
- •6.4. Build scripts are code
- •6.5. Task dependencies
- •6.6. Dynamic tasks
- •6.7. Manipulating existing tasks
- •6.8. Shortcut notations
- •6.9. Extra task properties
- •6.10. Using Ant Tasks
- •6.11. Using methods
- •6.12. Default tasks
- •6.13. Configure by DAG
- •6.14. Where to next?
- •7.1. The Java plugin
- •7.2. A basic Java project
- •7.3. Multi-project Java build
- •7.4. Where to next?
- •8.1. What is dependency management?
- •8.2. Declaring your dependencies
- •8.3. Dependency configurations
- •8.4. External dependencies
- •8.5. Repositories
- •8.6. Publishing artifacts
- •8.7. Where to next?
- •9.1. A basic Groovy project
- •9.2. Summary
- •10.1. Building a WAR file
- •10.2. Running your web application
- •10.3. Summary
- •11.1. Executing multiple tasks
- •11.2. Excluding tasks
- •11.3. Task name abbreviation
- •11.4. Selecting which build to execute
- •11.5. Obtaining information about your build
- •11.7. Summary
- •12.1. Task Tree
- •12.2. Favorites
- •12.3. Command Line
- •12.4. Setup
- •13.1. Enter the daemon
- •13.2. Reusing and expiration of daemons
- •13.3. Usage and troubleshooting
- •13.4. Daemon properties
- •14.1. Directory creation
- •14.2. Gradle properties and system properties
- •14.3. Configuring the project using an external build script
- •14.4. Configuring arbitrary objects
- •14.5. Configuring arbitrary objects using an external script
- •14.6. Caching
- •15.1. Configuring the build environment via gradle.properties
- •15.2. Accessing the web via a proxy
- •16.1. The Gradle build language
- •16.2. The Project API
- •16.3. The Script API
- •16.4. Declaring variables
- •16.5. Some Groovy basics
- •17.1. Defining tasks
- •17.2. Locating tasks
- •17.3. Configuring tasks
- •17.4. Adding dependencies to a task
- •17.5. Adding a description to a task
- •17.6. Replacing tasks
- •17.7. Skipping tasks
- •17.8. Skipping tasks that are up-to-date
- •17.9. Task rules
- •17.10. Summary
- •18.1. Locating files
- •18.2. File collections
- •18.3. File trees
- •18.4. Using the contents of an archive as a file tree
- •18.5. Specifying a set of input files
- •18.6. Copying files
- •18.7. Using the Sync task
- •18.8. Creating archives
- •19.1. Choosing a log level
- •19.2. Writing your own log messages
- •19.3. Logging from external tools and libraries
- •19.4. Changing what Gradle logs
- •20.1. Using Ant tasks and types in your build
- •20.2. Importing an Ant build
- •20.3. Ant properties and references
- •21.1. Applying plugins
- •21.2. What plugins do
- •21.3. Conventions
- •21.4. More on plugins
- •22.1. Language plugins
- •22.2. Experimental language plugins
- •22.3. Integration plugins
- •22.4. Software development plugins
- •22.5. Base plugins
- •22.6. Third party plugins
- •23.1. Usage
- •23.2. Source sets
- •23.3. Tasks
- •23.4. Project layout
- •23.5. Dependency management
- •23.6. Convention properties
- •23.7. Working with source sets
- •23.8. Javadoc
- •23.9. Clean
- •23.10. Resources
- •23.11. CompileJava
- •23.12. Test
- •23.14. Uploading
- •24.1. Usage
- •24.2. Tasks
- •24.3. Project layout
- •24.4. Dependency management
- •24.5. Convention properties
- •24.6. Source set properties
- •24.7. CompileGroovy
- •25.1. Usage
- •25.2. Tasks
- •25.3. Project layout
- •25.4. Dependency Management
- •25.5. Convention Properties
- •25.6. Source set properties
- •25.7. Fast Scala Compiler
- •26.1. Usage
- •26.2. Tasks
- •26.3. Project layout
- •26.4. Dependency management
- •26.5. Convention properties
- •26.7. Customizing
- •27.1. Usage
- •27.2. Tasks
- •27.3. Project layout
- •27.4. Dependency management
- •27.5. Convention properties
- •27.8. Using custom descriptor file
- •28.1. Usage
- •28.2. Tasks
- •28.3. Project layout
- •28.4. Dependency management
- •28.5. Convention properties
- •29.1. Usage
- •29.2. Tasks
- •29.3. Project layout
- •29.4. Dependency management
- •29.5. Configuration
- •30.1. Usage
- •30.2. Tasks
- •30.3. Project layout
- •30.4. Dependency management
- •30.5. Configuration
- •31.1. Usage
- •31.2. Tasks
- •31.3. Dependency management
- •31.4. Configuration
- •32.1. Usage
- •32.2. Tasks
- •32.3. Dependency management
- •32.4. Configuration
- •33.1. Usage
- •33.2. Tasks
- •33.3. Dependency management
- •33.4. Configuration
- •34.1. Usage
- •34.2. Analyzing Multi-Project Builds
- •34.3. Analyzing Custom Source Sets
- •34.4. Setting Custom Sonar Properties
- •34.5. Tasks
- •35.1. Usage
- •35.2. Implicitly applied plugins
- •35.3. Tasks
- •35.4. Dependency management
- •35.5. Convention object
- •36.1. Usage
- •36.2. Tasks
- •36.3. Configuration
- •36.4. Customizing the generated files
- •37.1. Usage
- •37.2. Tasks
- •37.3. Configuration
- •37.4. Customizing the generated files
- •37.5. Further things to consider
- •38.1. Usage
- •38.2. Tasks
- •38.3. Project layout
- •38.4. Dependency management
- •38.5. Convention properties
- •38.6. Source set properties
- •39.1. Usage
- •39.2. Tasks
- •39.3. Project layout
- •39.4. Dependency management
- •39.5. Convention properties
- •40.1. Usage
- •40.2. Tasks
- •40.3. Project layout
- •40.4. Dependency management
- •40.5. Convention properties
- •41.1. Usage
- •42.1. Usage
- •42.2. Tasks
- •42.3. Convention properties
- •42.4. Including other resources in the distribution
- •43.2. Dependency management overview
- •43.3. Dependency configurations
- •43.4. How to declare your dependencies
- •43.5. Working with dependencies
- •43.6. Repositories
- •43.7. How dependency resolution works
- •43.8. The dependency cache
- •43.9. Strategies for transitive dependency management
- •44.1. Introduction
- •44.2. Artifacts and configurations
- •44.3. Declaring artifacts
- •44.4. Publishing artifacts
- •44.5. More about project libraries
- •45.1. Usage
- •45.2. Tasks
- •45.3. Dependency management
- •45.4. Convention properties
- •45.5. Convention methods
- •45.6. Interacting with Maven repositories
- •46.1. Usage
- •46.2. Signatory credentials
- •46.3. Specifying what to sign
- •46.4. Publishing the signatures
- •46.5. Signing POM files
- •47.1. Usage
- •47.2. Source code locations
- •47.3. Compiling
- •47.4. Configuring the compiler
- •47.5. Working with shared libraries
- •47.6. Dependencies
- •47.7. Publishing
- •48.1. Build phases
- •48.2. Settings file
- •48.3. Multi-project builds
- •48.4. Initialization
- •48.5. Configuration and execution of a single project build
- •48.6. Responding to the lifecycle in the build script
- •49.1. Cross project configuration
- •49.2. Subproject configuration
- •49.3. Execution rules for multi-project builds
- •49.4. Running tasks by their absolute path
- •49.5. Project and task paths
- •49.6. Dependencies - Which dependencies?
- •49.7. Project lib dependencies
- •49.8. Multi-Project Building and Testing
- •49.9. Property and method inheritance
- •49.10. Summary
- •50.1. Packaging a task class
- •50.2. Writing a simple task class
- •50.3. A standalone project
- •51.1. Packaging a plugin
- •51.2. Writing a simple plugin
- •51.3. Getting input from the build
- •51.4. Working with files in custom tasks and plugins
- •51.5. A standalone project
- •51.6. Maintaining multiple domain objects
- •52.1. Inherited properties and methods
- •52.2. Injected configuration
- •52.3. Build sources in the buildSrc project
- •52.4. Running another Gradle build from a build
- •52.5. External dependencies for the build script
- •52.6. Ant optional dependencies
- •52.7. Summary
- •53.1. Basic usage
- •53.2. Using an init script
- •53.3. Writing an init script
- •53.4. External dependencies for the init script
- •54.1. Configuration
- •54.2. Unix file permissions
- •54.3. Environment variable
- •55.1. Introduction to the Tooling API
- •55.2. Tooling API and the Gradle Build Daemon
- •55.3. Quickstart
- •A.1. Sample customBuildLanguage
- •A.2. Sample customDistribution
- •A.3. Sample customPlugin
- •A.4. Sample java/multiproject
- •B.1. Groovy script variables
- •B.2. Configuration and execution phase
- •C.1. Deprecated command-line options
- •C.2. Daemon command-line options:
- •C.3. System properties
- •C.4. Environment variables
- •D.1. IntelliJ
- •D.2. Eclipse
- •D.3. Using Gradle without IDE support
37
The IDEA Plugin
The IDEA plugin generates files that are used by IntelliJ IDEA, thus making it possible to open the project from IDEA (File - Open Project). Both external dependencies (including associated source and javadoc files) and project dependencies are considered.
What exactly the IDEA plugin generates depends on which other plugins are used:
Table 37.1. IDEA plugin behavior
Plugin |
Description |
None |
Generates an IDEA module file. Also generates an IDEA project and workspace file |
|
if the project is the root project. |
Java |
Adds Java configuration to the module and project files. |
One focus of the IDEA plugin is to be open to customization. The plugin provides a standardized set of hooks for adding and removing content from the generated files.
37.1. Usage
To use the IDEA plugin, include this in your build script:
Example 37.1. Using the IDEA plugin
build.gradle
apply plugin: 'idea'
The IDEA plugin adds a number of tasks to your project. The main tasks that you will use are the i and cleanIdea tasks.
Page 197 of 343
37.2. Tasks
The IDEA plugin adds the tasks shown below to a project. Notice that clean does not depend on c
. It's because workspace contains a lot of user specific temporary data and typically it is no desirable to manipulate it outside IDEA.
Table 37.2. IDEA plugin - Tasks
Task name |
Depends on |
Type |
Description |
idea |
ideaProject, ideaModule- |
Generates |
|
|
, ideaWorkspace |
|
all IDEA |
|
|
|
configuratio |
|
|
|
files |
cleanIdea |
cleanIdeaProject |
Delete |
Removes al |
|
, cleanIdeaModule |
|
IDEA |
|
|
|
configuratio |
|
|
|
files |
cleanIdeaProject |
- |
Delete |
Removes |
|
|
|
the IDEA |
|
|
|
project file |
cleanIdeaModule |
- |
Delete |
Removes |
|
|
|
the IDEA |
|
|
|
module file |
cleanIdeaWorkspace |
- |
Delete |
Removes |
|
|
|
the IDEA |
|
|
|
workspace |
|
|
|
file |
ideaProject |
- |
GenerateIdeaProject |
Generates |
|
|
|
the .ipr |
|
|
|
file. This |
|
|
|
task is only |
|
|
|
added to th |
|
|
|
root project. |
ideaModule |
- |
GenerateIdeaModule |
Generates |
|
|
|
the .iml fil |
ideaWorkspace |
- |
GenerateIdeaWorkspace |
Generates |
|
|
|
the .iws |
file. This task is only added to th root project.
Page 198 of 343
37.3. Configuration
Table 37.3. Configuration of the idea plugin
Model |
Reference name |
Description |
IdeaModel |
idea |
Top level element that enables configuration of the |
|
|
idea plugin in a DSL-friendly fashion |
IdeaProject |
idea.project |
Allows configuring project information |
IdeaModule |
idea.module |
Allows configuring module information |
IdeaWorkspace |
idea.workspace |
Allows configuring the workspace xml |
37.4. Customizing the generated files
IDEA plugin provides hooks and behavior for customizing the generated content. The workspace file can effectively only be manipulated via the withXml hook because its corresponding domain object is essentially empty.
The tasks recognize existing IDEA files, and merge them with the generated content.
37.4.1. Merging
Sections of existing IDEA files that are also the target of generated content will be amended or overwritten, depending on the particular section. The remaining sections will be left as-is.
37.4.1.1. Disabling merging with a complete overwrite
To completely overwrite existing IDEA files, execute a clean task together with its corresponding generation task, for example gradle cleanIdea idea (in that order). If you want to make this the default behavior, add tasks.idea.dependsOn(cleanIdea) to your build script. This makes it unnecessary to execute the clean task explicitly.
Complete overwrite works equally well for individual files, for example by executing gradle clean
.
37.4.2. Hooking into the generation lifecycle
The plugin provides objects modeling the sections of the metadata files that are generated by Gradle. The generation lifecycle is as follows:
1.The file is read; or a default version provided by Gradle is used if it does not exist
2.The beforeMerged hook is executed with a domain object representing the existing file
3.The existing content is merged with the configuration inferred from the Gradle build or defined explicitly in the eclipse DSL
4.The whenMerged hook is executed with a domain object representing contents of the file to be persisted
5.The withXml hook is executed with a raw representation of the xml that will be persisted
6.The final XML is persisted
Page 199 of 343
The following table lists the domain object used for each of the model types:
Table 37.4. Idea plugin hooks
Model |
beforeMerged { arg -> } |
whenMerged { arg -> } |
withXml |
|
argument type |
argument type |
argumen |
IdeaProject |
Project |
Project |
XmlProv |
IdeaModule |
Module |
Module |
XmlProv |
IdeaWorkspace |
Workspace |
Workspace |
XmlProv |
37.4.2.1. Partial overwrite of existing content
A complete overwrite causes all existing content to be discarded, thereby losing any changes made directly in the IDE. The beforeMerged hook makes it possible to overwrite just certain parts of the existing content. The following example removes all existing dependencies from the Module domain object:
Example 37.2. Partial Overwrite for Module
build.gradle
idea.module.iml { beforeMerged { module ->
module.dependencies.clear()
}
}
The resulting module file will only contain Gradle-generated dependency entries, but not any other dependency entries that may have been present in the original file. (In the case of dependency entries, this is also the default behavior.) Other sections of the module file will be either left as-is or merged. The same could be done for the module paths in the project file:
Example 37.3. Partial Overwrite for Project
build.gradle
idea.project.ipr { beforeMerged { project ->
project.modulePaths.clear()
}
}
37.4.2.2. Modifying the fully populated domain objects
The whenMerged hook allows to manipulate the fully populated domain objects. Often this is the preferred way to customize IDEA files. Here is how you would export all the dependencies of an IDEA module:
Page 200 of 343