Gradle User Guide

Version 1.4

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.

Table of Contents

1. Introduction
1.1. About this user guide
2. Overview
2.1. Features
2.2. Why Groovy?
3. Tutorials
3.1. Getting Started
4. Installing Gradle
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. Troubleshooting
5.1. Working through problems
5.2. Getting help
6. Build Script Basics
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. Java Quickstart
7.1. The Java plugin
7.2. A basic Java project
7.3. Multi-project Java build
7.4. Where to next?
8. Dependency Management Basics
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. Groovy Quickstart
9.1. A basic Groovy project
9.2. Summary
10. Web Application Quickstart
10.1. Building a WAR file
10.2. Running your web application
10.3. Summary
11. Using the Gradle Command-Line
11.1. Executing multiple tasks
11.2. Excluding tasks
11.3. Continuing the build when a failure occurs
11.4. Task name abbreviation
11.5. Selecting which build to execute
11.6. Obtaining information about your build
11.7. Dry Run
11.8. Summary
12. Using the Gradle Graphical User Interface
12.1. Task Tree
12.2. Favorites
12.3. Command Line
12.4. Setup
13. Writing Build Scripts
13.1. The Gradle build language
13.2. The Project API
13.3. The Script API
13.4. Declaring variables
13.5. Some Groovy basics
14. Tutorial - 'This and That'
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. More about Tasks
15.1. Defining tasks
15.2. Locating tasks
15.3. Configuring tasks
15.4. Adding dependencies to a task
15.5. Adding a description to a task
15.6. Replacing tasks
15.7. Skipping tasks
15.8. Skipping tasks that are up-to-date
15.9. Task rules
15.10. Summary
16. Working With Files
16.1. Locating files
16.2. File collections
16.3. File trees
16.4. Using the contents of an archive as a file tree
16.5. Specifying a set of input files
16.6. Copying files
16.7. Using the Sync task
16.8. Creating archives
17. Using Ant from Gradle
17.1. Using Ant tasks and types in your build
17.2. Importing an Ant build
17.3. Ant properties and references
17.4. API
18. Logging
18.1. Choosing a log level
18.2. Writing your own log messages
18.3. Logging from external tools and libraries
18.4. Changing what Gradle logs
19. The Gradle Daemon
19.1. Enter the daemon
19.2. Reusing and expiration of daemons
19.3. Usage and troubleshooting
19.4. Configuring the daemon
20. The Build Environment
20.1. Configuring the build environment via gradle.properties
20.2. Accessing the web via a proxy
21. Gradle Plugins
21.1. Applying plugins
21.2. What plugins do
21.3. Conventions
21.4. More on plugins
22. Standard Gradle plugins
22.1. Language plugins
22.2. Incubating language plugins
22.3. Integration plugins
22.4. Incubating integration plugins
22.5. Software development plugins
22.6. Base plugins
22.7. Third party plugins
23. The Java Plugin
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.13. Jar
23.14. Uploading
24. The Groovy Plugin
24.1. Usage
24.2. Tasks
24.3. Project layout
24.4. Dependency management
24.5. Adding custom GroovyCompile and Groovydoc tasks
24.6. Convention properties
24.7. Source set properties
24.8. GroovyCompile
25. The Scala Plugin
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
25.8. Compiling in external process
25.9. Incremental compilation
26. The War Plugin
26.1. Usage
26.2. Tasks
26.3. Project layout
26.4. Dependency management
26.5. Convention properties
26.6. War
26.7. Customizing
27. The Ear Plugin
27.1. Usage
27.2. Tasks
27.3. Project layout
27.4. Dependency management
27.5. Convention properties
27.6. Ear
27.7. Customizing
27.8. Using custom descriptor file
28. The Jetty Plugin
28.1. Usage
28.2. Tasks
28.3. Project layout
28.4. Dependency management
28.5. Convention properties
29. The Checkstyle Plugin
29.1. Usage
29.2. Tasks
29.3. Project layout
29.4. Dependency management
29.5. Configuration
30. The CodeNarc Plugin
30.1. Usage
30.2. Tasks
30.3. Project layout
30.4. Dependency management
30.5. Configuration
31. The FindBugs Plugin
31.1. Usage
31.2. Tasks
31.3. Dependency management
31.4. Configuration
32. The JDepend Plugin
32.1. Usage
32.2. Tasks
32.3. Dependency management
32.4. Configuration
33. The PMD Plugin
33.1. Usage
33.2. Tasks
33.3. Dependency management
33.4. Configuration
34. The Sonar Plugin
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. The OSGi Plugin
35.1. Usage
35.2. Implicitly applied plugins
35.3. Tasks
35.4. Dependency management
35.5. Convention object
35.6.
36. The Eclipse Plugin
36.1. Usage
36.2. Tasks
36.3. Configuration
36.4. Customizing the generated files
37. The IDEA Plugin
37.1. Usage
37.2. Tasks
37.3. Configuration
37.4. Customizing the generated files
37.5. Further things to consider
38. The ANTLR Plugin
38.1. Usage
38.2. Tasks
38.3. Project layout
38.4. Dependency management
38.5. Convention properties
38.6. Source set properties
39. The Project Report Plugin
39.1. Usage
39.2. Tasks
39.3. Project layout
39.4. Dependency management
39.5. Convention properties
40. The Announce Plugin
40.1. Usage
40.2. Configuration
41. The Build Announcements Plugin
41.1. Usage
42. The Application Plugin
42.1. Usage
42.2. Tasks
42.3. Convention properties
42.4. Including other resources in the distribution
43. The Java Library Distribution Plugin
43.1. Usage
43.2. Tasks
43.3. Extension properties
43.4. Including other resources in the distribution
44. Bootstrap Plugin
44.1. Maven conversion - features
44.2. Usage
45. Dependency Management
45.1. Introduction
45.2. Dependency Management Best Practices.
45.3. Dependency configurations
45.4. How to declare your dependencies
45.5. Working with dependencies
45.6. Repositories
45.7. How dependency resolution works
45.8. Manipulating the dependency metadata during the resolution process
45.9. The dependency cache
45.10. Strategies for transitive dependency management
46. Publishing artifacts
46.1. Introduction
46.2. Artifacts and configurations
46.3. Declaring artifacts
46.4. Publishing artifacts
46.5. More about project libraries
47. The Maven Plugin
47.1. Usage
47.2. Tasks
47.3. Dependency management
47.4. Convention properties
47.5. Convention methods
47.6. Interacting with Maven repositories
48. The Signing Plugin
48.1. Usage
48.2. Signatory credentials
48.3. Specifying what to sign
48.4. Publishing the signatures
48.5. Signing POM files
49. C++ Support
49.1. Usage
49.2. Source code locations
49.3. Compiling
49.4. Configuring the compiler
49.5. Working with shared libraries
49.6. Dependencies
49.7. Publishing
50. The Build Lifecycle
50.1. Build phases
50.2. Settings file
50.3. Multi-project builds
50.4. Initialization
50.5. Configuration and execution of a single project build
50.6. Responding to the lifecycle in the build script
51. Multi-project Builds
51.1. Cross project configuration
51.2. Subproject configuration
51.3. Execution rules for multi-project builds
51.4. Running tasks by their absolute path
51.5. Project and task paths
51.6. Dependencies - Which dependencies?
51.7. Project lib dependencies
51.8. Decoupled Projects
51.9. Multi-Project Building and Testing
51.10. Property and method inheritance
51.11. Summary
52. Writing Custom Task Classes
52.1. Packaging a task class
52.2. Writing a simple task class
52.3. A standalone project
53. Writing Custom Plugins
53.1. Packaging a plugin
53.2. Writing a simple plugin
53.3. Getting input from the build
53.4. Working with files in custom tasks and plugins
53.5. A standalone project
53.6. Maintaining multiple domain objects
54. Organizing Build Logic
54.1. Inherited properties and methods
54.2. Injected configuration
54.3. Build sources in the buildSrc project
54.4. Running another Gradle build from a build
54.5. External dependencies for the build script
54.6. Ant optional dependencies
54.7. Summary
55. Initialization Scripts
55.1. Basic usage
55.2. Using an init script
55.3. Writing an init script
55.4. External dependencies for the init script
56. The Gradle Wrapper
56.1. Configuration
56.2. Unix file permissions
56.3. Environment variable
57. Embedding Gradle
57.1. Introduction to the Tooling API
57.2. Tooling API and the Gradle Build Daemon
57.3. Quickstart
58. Comparing Builds
58.1. Definition of terms
58.2. Current Capabilities
58.3. Comparing Gradle Builds
59. Ivy Publishing (new)
59.1. The “ivy-publish” Plugin
59.2. Publications
59.3. Repositories
59.4. Performing a publish
59.5. Generating the Ivy module descriptor file
59.6. Future features
60. Maven Publishing (new)
60.1. The maven-publish Plugin
60.2. Publications
60.3. Repositories
60.4. Performing a publish
60.5. Publishing to Maven Local
A. Gradle Samples
A.1. Sample customBuildLanguage
A.2. Sample customDistribution
A.3. Sample customPlugin
A.4. Sample java/multiproject
B. Potential Traps
B.1. Groovy script variables
B.2. Configuration and execution phase
C. The Feature Lifecycle
C.1. States
C.2. Backwards Compatibility Policy
D. Gradle Command Line
D.1. Deprecated command-line options
D.2. Daemon command-line options:
D.3. System properties
D.4. Environment variables
E. Existing IDE Support and how to cope without it
E.1. IntelliJ
E.2. Eclipse
E.3. Using Gradle without IDE support
Glossary

List of Examples

6.1. The first build script
6.2. Execution of a build script
6.3. A task definition shortcut
6.4. Using Groovy in Gradle's tasks
6.5. Using Groovy in Gradle's tasks
6.6. Declaration of dependencies between tasks
6.7. Lazy dependsOn - the other task does not exist (yet)
6.8. Dynamic creation of a task
6.9. Accessing a task via API - adding a dependency
6.10. Accessing a task via API - adding behaviour
6.11. Accessing task as a property of the build script
6.12. Adding extra properties to a task
6.13. Using AntBuilder to execute ant.loadfile target
6.14. Using methods to organize your build logic
6.15. Defining a default tasks
6.16. Different outcomes of build depending on chosen tasks
7.1. Using the Java plugin
7.2. Building a Java project
7.3. Adding Maven repository
7.4. Adding dependencies
7.5. Customization of MANIFEST.MF
7.6. Adding a test system property
7.7. Publishing the JAR file
7.8. Eclipse plugin
7.9. Java example - complete build file
7.10. Multi-project build - hierarchical layout
7.11. Multi-project build - settings.gradle file
7.12. Multi-project build - common configuration
7.13. Multi-project build - dependencies between projects
7.14. Multi-project build - distribution file
8.1. Declaring dependencies
8.2. Definition of an external dependency
8.3. Shortcut definition of an external dependency
8.4. Usage of Maven central repository
8.5. Usage of a remote Maven repository
8.6. Usage of a remote Ivy directory
8.7. Usage of a local Ivy directory
8.8. Publishing to an Ivy repository
8.9. Publishing to a Maven repository
9.1. Groovy plugin
9.2. Dependency on Groovy 1.7.10
9.3. Groovy example - complete build file
10.1. War plugin
10.2. Running web application with Jetty plugin
11.1. Executing multiple tasks
11.2. Excluding tasks
11.3. Abbreviated task name
11.4. Abbreviated camel case task name
11.5. Selecting the project using a build file
11.6. Selecting the project using project directory
11.7. Obtaining information about projects
11.8. Providing a description for a project
11.9. Obtaining information about tasks
11.10. Changing the content of the task report
11.11. Obtaining more information about tasks
11.12. Obtaining information about dependencies
11.13. Filtering dependency report by configuration
11.14. Getting the insight into a particular dependency
11.15. Information about properties
12.1. Launching the GUI
13.1. Accessing property of the Project object
13.2. Using local variables
13.3. Using extra properties
13.4. Groovy JDK methods
13.5. Property accessors
13.6. Method call without parentheses
13.7. List and map literals
13.8. Closure as method parameter
13.9. Closure delegates
14.1. Directory creation with mkdir
14.2. Setting properties with a gradle.properties file
14.3. Configuring the project using an external build script
14.4. Configuring arbitrary objects
14.5. Configuring arbitrary objects using a script
15.1. Defining tasks
15.2. Defining tasks - using strings
15.3. Defining tasks with alternative syntax
15.4. Accessing tasks as properties
15.5. Accessing tasks via tasks collection
15.6. Accessing tasks by path
15.7. Creating a copy task
15.8. Configuring a task - various ways
15.9. Configuring a task - fluent interface
15.10. Configuring a task - with closure
15.11. Configuring a task - with configure() method
15.12. Defining a task with closure
15.13. Adding dependency on task from another project
15.14. Adding dependency using task object
15.15. Adding dependency using closure
15.16. Adding a description to a task
15.17. Overwriting a task
15.18. Skipping a task using a predicate
15.19. Skipping tasks with StopExecutionException
15.20. Enabling and disabling tasks
15.21. A generator task
15.22. Declaring the inputs and outputs of a task
15.23. Task rule
15.24. Dependency on rule based tasks
16.1. Locating files
16.2. Creating a file collection
16.3. Using a file collection
16.4. Implementing a file collection
16.5. Creating a file tree
16.6. Using a file tree
16.7. Using an archive as a file tree
16.8. Specifying a set of files
16.9. Specifying a set of files
16.10. Copying files using the copy task
16.11. Specifying copy task source files and destination directory
16.12. Selecting the files to copy
16.13. Copying files using the copy() method
16.14. Renaming files as they are copied
16.15. Filtering files as they are copied
16.16. Nested copy specs
16.17. Using the Sync task to copy dependencies
16.18. Creating a ZIP archive
16.19. Creation of ZIP archive
16.20. Configuration of archive task - custom archive name
16.21. Configuration of archive task - appendix & classifier
17.1. Using an Ant task
17.2. Passing nested text to an Ant task
17.3. Passing nested elements to an Ant task
17.4. Using an Ant type
17.5. Using a custom Ant task
17.6. Declaring the classpath for a custom Ant task
17.7. Using a custom Ant task and dependency management together
17.8. Importing an Ant build
17.9. Task that depends on Ant target
17.10. Adding behaviour to an Ant target
17.11. Ant target that depends on Gradle task
17.12. Setting an Ant property
17.13. Getting an Ant property
17.14. Setting an Ant reference
17.15. Getting an Ant reference
18.1. Using stdout to write log messages
18.2. Writing your own log messages
18.3. Using SLF4J to write log messages
18.4. Configuring standard output capture
18.5. Configuring standard output capture for a task
18.6. Customizing what Gradle logs
20.1. Configuring an HTTP proxy
20.2. Configuring an HTTPS proxy
21.1. Applying a plugin
21.2. Applying a plugin by type
21.3. Applying a plugin by type
21.4. Tasks added by a plugin
21.5. Changing plugin defaults
21.6. Plugin convention object
23.1. Using the Java plugin
23.2. Custom Java source layout
23.3. Accessing a source set
23.4. Configuring the source directories of a source set
23.5. Defining a source set
23.6. Defining source set dependencies
23.7. Compiling a source set
23.8. Assembling a JAR for a source set
23.9. Generating the Javadoc for a source set
23.10. Running tests in a source set
23.11. Creating a unit test report for subprojects
23.12. Customization of MANIFEST.MF
23.13. Creating a manifest object.
23.14. Separate MANIFEST.MF for a particular archive
23.15. Separate MANIFEST.MF for a particular archive
24.1. Using the Groovy plugin
24.2. Custom Groovy source layout
24.3. Configuration of Groovy dependency
24.4. Configuration of Groovy test dependency
24.5. Configuration of bundled Groovy dependency
24.6. Configuration of Groovy configuration
24.7. Configuration of Groovy file dependency
25.1. Using the Scala plugin
25.2. Custom Scala source layout
25.3. Declaring a Scala dependency for production code
25.4. Declaring a Scala dependency for test code
25.5. Enabling the Fast Scala Compiler
25.6. Adjusting memory settings
25.7. Activating the Zinc based compiler
26.1. Using the War plugin
26.2. Customization of war plugin
27.1. Using the Ear plugin
27.2. Customization of ear plugin
28.1. Using the Jetty plugin
29.1. Using the Checkstyle plugin
30.1. Using the CodeNarc plugin
31.1. Using the FindBugs plugin
32.1. Using the JDepend plugin
33.1. Using the PMD plugin
34.1. Applying the Sonar plugin
34.2. Configuring Sonar connection settings
34.3. Configuring Sonar project settings
34.4. Global configuration in a multi-project build
34.5. Common project configuration in a multi-project build
34.6. Individual project configuration in a multi-project build
34.7. Configuring the language to be analyzed
34.8. Using property syntax
34.9. Analyzing custom source sets
34.10. Setting custom global properties
34.11. Setting custom project properties
35.1. Using the OSGi plugin
35.2. Configuration of OSGi MANIFEST.MF file
36.1. Using the Eclipse plugin
36.2. Partial Overwrite for Classpath
36.3. Partial Overwrite for Project
36.4. Export Dependencies
36.5. Customizing the XML
37.1. Using the IDEA plugin
37.2. Partial Overwrite for Module
37.3. Partial Overwrite for Project
37.4. Export Dependencies
37.5. Customizing the XML
38.1. Using the ANTLR plugin
38.2. Declare ANTLR version
40.1. Using the announce plugin
40.2. Configure the announce plugin
40.3. Using the announce plugin
41.1. Using the build announcements plugin
41.2. Using the build announcements plugin from an init script
42.1. Using the application plugin
42.2. Configure the application main class
42.3. Include output from other tasks in the application distribution
42.4. Automatically creating files for distribution
43.1. Using the java library distribution plugin
43.2. Configure the distribution name
43.3. Include files in the distribution
45.1. Definition of a configuration
45.2. Accessing a configuration
45.3. Configuration of a configuration
45.4. Module dependencies
45.5. Artifact only notation
45.6. Dependency with classifier
45.7. Usage of external dependency of a configuration
45.8. Client module dependencies - transitive dependencies
45.9. Project dependencies
45.10. File dependencies
45.11. Generated file dependencies
45.12. Gradle API dependencies
45.13. Gradle's Groovy dependencies
45.14. Excluding transitive dependencies
45.15. Optional attributes of dependencies
45.16. Collections and arrays of dependencies
45.17. Dependency configurations
45.18. Dependency configurations for project
45.19. Configuration.copy
45.20. Accessing declared dependencies
45.21. Configuration.files
45.22. Configuration.files with spec
45.23. Configuration.copy
45.24. Configuration.copy vs. Configuration.files
45.25. Adding central Maven repository
45.26. Adding the local Maven cache as a repository
45.27. Adding custom Maven repository
45.28. Adding additional Maven repositories for JAR files
45.29. Accessing password protected Maven repository
45.30. Flat repository resolver
45.31. Ivy repository
45.32. Ivy repository with pattern layout
45.33. Ivy repository with Maven compatible layout
45.34. Ivy repository with custom patterns
45.35. Ivy repository
45.36. Accessing a repository
45.37. Configuration of a repository
45.38. Definition of a custom repository
45.39. Forcing consistent version for a group of libraries
45.40. Using a custom versioning scheme
45.41. Blacklisting a version with a replacement
45.42. Dynamic version cache control
45.43. Changing module cache control
46.1. Defining an artifact using an archive task
46.2. Defining an artifact using a file
46.3. Customizing an artifact
46.4. Map syntax for defining an artifact using a file
46.5. Configuration of the upload task
47.1. Using the Maven plugin
47.2. Creating a stand alone pom.
47.3. Upload of file to remote Maven repository
47.4. Upload of file via SSH
47.5. Customization of pom
47.6. Builder style customization of pom
47.7. Modifying auto-generated content
47.8. Customization of Maven installer
47.9. Generation of multiple poms
47.10. Accessing a mapping configuration
48.1. Using the Signing plugin
48.2. Signing a configuration
48.3. Signing a configuration output
48.4. Signing a task
48.5. Signing a task output
48.6. Conditional signing
48.7. Signing a POM for deployment
49.1. Using the 'cpp-exe' plugin
49.2. Using the 'cpp-lib' plugin
49.3. Supplying arbitrary args to the compiler
49.4. Declaring dependencies
49.5. Declaring project dependencies
49.6. Uploading exe or lib
50.1. Single project build
50.2. Hierarchical layout
50.3. Flat layout
50.4. Modification of elements of the project tree
50.5. Modification of elements of the project tree
50.6. Adding of test task to each project which has certain property set
50.7. Notifications
50.8. Setting of certain property to all tasks
50.9. Logging of start and end of each task execution
51.1. Multi-project tree - water & bluewhale projects
51.2. Build script of water (parent) project
51.3. Multi-project tree - water, bluewhale & krill projects
51.4. Water project build script
51.5. Defining common behaviour of all projects and subprojects
51.6. Defining specific behaviour for particular project
51.7. Defining specific behaviour for project krill
51.8. Adding custom behaviour to some projects (filtered by project name)
51.9. Adding custom behaviour to some projects (filtered by project properties)
51.10. Running build from subproject
51.11. Evaluation and execution of projects
51.12. Evaluation and execution of projects
51.13. Running tasks by their absolute path
51.14. Dependencies and execution order
51.15. Dependencies and execution order
51.16. Dependencies and execution order
51.17. Declaring dependencies
51.18. Declaring dependencies
51.19. Cross project task dependencies
51.20. Configuration time dependencies
51.21. Configuration time dependencies - evaluationDependsOn
51.22. Configuration time dependencies
51.23. Dependencies - real life example - crossproject configuration
51.24. Project lib dependencies
51.25. Project lib dependencies
51.26. Fine grained control over dependencies
51.27. Build and Test Single Project
51.28. Partial Build and Test Single Project
51.29. Build and Test Depended On Projects
51.30. Build and Test Dependent Projects
52.1. Defining a custom task
52.2. A hello world task
52.3. A customizable hello world task
52.4. A build for a custom task
52.5. A custom task
52.6. Using a custom task in another project
52.7. Testing a custom task
53.1. A custom plugin
53.2. A custom plugin extension
53.3. A custom plugin with configuration closure
53.4. Evaluating file properties lazily
53.5. A build for a custom plugin
53.6. Wiring for a custom plugin
53.7. Using a custom plugin in another project
53.8. Testing a custom plugin
53.9. Managing domain objects
54.1. Using inherited properties and methods
54.2. Using injected properties and methods
54.3. Custom buildSrc build script
54.4. Adding subprojects to the root buildSrc project
54.5. Running another build from a build
54.6. Declaring external dependencies for the build script
54.7. A build script with external dependencies
54.8. Ant optional dependencies
55.1. Using init script to perform extra configuration before projects are evaluated
55.2. Declaring external dependencies for an init script
55.3. An init script with external dependencies
56.1. Wrapper task
56.2. Wrapper generated files
56.3. Configuration of wrapper task
59.1. Applying the “ivy-publish” plugin
59.2. A build to publish
59.3. Example generated ivy.xml
59.4. Modifying the Ivy descriptor
59.5. Declaring repositories to publish to
59.6. Publishing via single publish task
59.7. Publishing via “publish” lifecycle task
59.8. Generating the Ivy module descriptor file
60.1. Applying the 'maven-publish' plugin
60.2. Modifying the POM file
60.3. Declaring repositories to publish to
60.4. A build to publish
60.5. Publish a project to the Maven local repository
B.1. Variables scope: local and script wide
B.2. Distinct configuration and execution phase