# DependencyHandler

API Documentation: | `DependencyHandler`

A `DependencyHandler` is used to declare dependencies. Dependencies are grouped into configurations (see `Configuration`).

To declare a specific dependency for a configuration you can use the following syntax:

    dependencies {
        configurationName dependencyNotation
    }

Example shows a basic way of declaring dependencies.

    plugins {
        id 'java' // so that we can use 'implementation', 'testImplementation' for dependencies
    }

    dependencies {
      //for dependencies found in artifact repositories you can use
      //the group:name:version notation
      implementation 'commons-lang:commons-lang:2.6'
      testImplementation 'org.mockito:mockito:1.9.0-rc1'

      //map-style notation:
      implementation group: 'com.google.code.guice', name: 'guice', version: '1.0'

      //declaring arbitrary files as dependencies
      implementation files('hibernate.jar', 'libs/spring.jar')

      //putting all jars from 'libs' onto compile classpath
      implementation fileTree('libs')
    }

### Advanced dependency configuration

To do some advanced configuration on a dependency when it is declared, you can additionally pass a configuration closure:

    dependencies {
        configurationName(dependencyNotation){
            configStatement1
            configStatement2
        }
    }

Examples of advanced dependency declaration including:

- Forcing certain dependency version in case of the conflict.
- Excluding certain dependencies by name, group or both. More details about per-dependency exclusions can be found in docs for `ModuleDependency.exclude(java.util.Map)`.
- Avoiding transitive dependencies for certain dependency.

    plugins {
        id 'java' // so that I can declare 'implementation' dependencies
    }

    dependencies {
      implementation('org.hibernate:hibernate') {
        //in case of versions conflict '3.1' version of hibernate wins:
        version {
          strictly('3.1')
        }

        //excluding a particular transitive dependency:
        exclude module: 'cglib' //by artifact name
        exclude group: 'org.jmock' //by group
        exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group

        //disabling all transitive dependencies of this dependency
        transitive = false
      }
    }

More examples of advanced configuration, useful when dependency module has multiple artifacts:

- Declaring dependency to a specific configuration of the module.
- Explicit specification of the artifact. See also `ModuleDependency.artifact(groovy.lang.Closure)`.

    plugins {
        id("java-library")
    }

    dependencies {
      // Configuring dependency to specific configuration of the module
      // This notation should _only_ be used for Ivy dependencies
      implementation(group: "org.someOrg", name: "someModule", version: "1.0", configuration: "someConf")

      // Configuring dependency on 'someLib' module
      implementation(group: 'org.myorg', name: 'someLib', version:'1.0') {
        // Explicitly adding the dependency artifact:
        // Prefer variant-aware dependency resolution
        artifact {
          // Useful when some artifact properties unconventional
          name = 'someArtifact' // Artifact name different than module name
          extension = 'someExt'
          type = 'someType'
          classifier = 'someClassifier'
        }
      }
    }

### Dependency notations

There are several supported dependency notations. These are described below. For each dependency declared this way, a `Dependency` object is created. You can use this object to query or further configure the dependency.

You can also always add instances of `Dependency` directly:

`configurationName <instance>`

Dependencies can also be declared with a `Provider` that provides any of the other supported dependency notations.

#### External dependencies

There are two notations supported for declaring a dependency on an external module. One is a string notation formatted this way:

`configurationName "group:name:version:classifier@extension"`

The other is a map notation:

`configurationName group: group, name: name, version: version, classifier: classifier, ext: extension`

In both notations, all properties, except name, are optional.

External dependencies are represented by a `ExternalModuleDependency`.

    plugins {
        id 'java' // so that we can use 'implementation', 'testImplementation' for dependencies
    }

    dependencies {
      //for dependencies found in artifact repositories you can use
      //the string notation, e.g. group:name:version
      implementation 'commons-lang:commons-lang:2.6'
      testImplementation 'org.mockito:mockito:1.9.0-rc1'

      //map notation:
      implementation group: 'com.google.code.guice', name: 'guice', version: '1.0'
    }

#### Project dependencies

To add a project dependency, you use the following notation:

`configurationName project(':some-project')`

The notation `project(':project-a')` is similar to the syntax you use when configuring a projectA in a multi-module gradle project.

Project dependencies are resolved by treating each consumable configuration in the target project as a variant and performing variant-aware attribute matching against them. However, in order to override this process, an explicit target configuration can be specified:

`configurationName project(path: ':project-a', configuration: 'someOtherConfiguration')`

Project dependencies are represented using a `ProjectDependency`.

#### File dependencies

You can also add a dependency using a `FileCollection`:

`configurationName files('a file')`

    plugins {
        id 'java' // so that we can use 'implementation', 'testImplementation' for dependencies
    }

    dependencies {
      //declaring arbitrary files as dependencies
      implementation files('hibernate.jar', 'libs/spring.jar')

      //putting all jars from 'libs' onto compile classpath
      implementation fileTree('libs')
    }

File dependencies are represented using a `FileCollectionDependency`.

#### Dependencies to other configurations

You can add a dependency using a `Configuration`.

When the configuration is from the same project as the target configuration, the target configuration is changed to extend from the provided configuration.

When the configuration is from a different project, a project dependency is added.

#### Gradle distribution specific dependencies

It is possible to depend on certain Gradle APIs or libraries that Gradle ships with. It is particularly useful for Gradle plugin development. Example:

    //Our Gradle plugin is written in groovy
    plugins {
        id 'groovy'
    }
    // now we can use the 'implementation' configuration for declaring dependencies

    dependencies {
      //we will use the Groovy version that ships with Gradle:
      implementation localGroovy()

      //our plugin requires Gradle API interfaces and classes to compile:
      implementation gradleApi()

      //we will use the Gradle test-kit to test build logic:
      testImplementation gradleTestKit()
    }

### Properties

Property | Description
`components` | The component metadata handler for this project. The returned handler can be used for adding rules that modify the metadata of depended-on software components.
`constraints` | The dependency constraint handler for this project.
`extensions` | The container of extensions.
`modules` | The component module metadata handler for this project. The returned handler can be used for adding rules that modify the metadata of depended-on software components.

### Methods

Method | Description
`add(configurationName, dependencyNotation)` | Adds a dependency to the given configuration.
`add(configurationName, dependencyNotation, configureClosure)` | Adds a dependency to the given configuration, and configures the dependency using the given closure.
`components(configureAction)` | Configures component metadata for this project.
`constraints(configureAction)` | Configures dependency constraint for this project.
`create(dependencyNotation)` | Creates a dependency without adding it to a configuration.
`create(dependencyNotation, configureClosure)` | Creates a dependency without adding it to a configuration, and configures the dependency using the given closure.
`createArtifactResolutionQuery()` | Creates an artifact resolution query.
`enforcedPlatform(notation)` | Declares a dependency on an enforced platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library. An enforced platform is a platform for which the direct dependencies are forced, meaning that they would override any other version found in the graph.
`enforcedPlatform(notation, configureAction)` | Declares a dependency on an enforced platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library. An enforced platform is a platform for which the direct dependencies are forced, meaning that they would override any other version found in the graph.
`enforcedPlatform(dependencyProvider)` | Configures this dependency provider to select the enforced-platform variant of the target component
`enforcedPlatform(dependencyProviderConvertible)` | Configures this dependency provider to select the enforced-platform variant of the target component
`gradleApi()` | Creates a dependency on the API of the current version of Gradle.
`gradleTestKit()` | Creates a dependency on the Gradle test-kit API.
`localGroovy()` | Creates a dependency on the Groovy that is distributed with the current version of Gradle.
`modules(configureAction)` | Configures module metadata for this project.
`platform(notation)` | Declares a dependency on a platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library.
`platform(notation, configureAction)` | Declares a dependency on a platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library.
`platform(dependencyProvider)` | Configures this dependency provider to select the platform variant of the target component
`platform(dependencyProviderConvertible)` | Configures this dependency provider to select the platform variant of the target component
`project(notation)` | Creates a dependency on a project.
`registerTransform(actionType, registrationAction)` | Registers an artifact transform.

### Script blocks

No script blocks

### Property details

#### `ComponentMetadataHandler` `components` (read-only)

The component metadata handler for this project. The returned handler can be used for adding rules that modify the metadata of depended-on software components.

#### `DependencyConstraintHandler` `constraints` (read-only)

The dependency constraint handler for this project.

#### `ExtensionContainer` `extensions` (read-only)

The container of extensions.

#### `ComponentModuleMetadataHandler` `modules` (read-only)

The component module metadata handler for this project. The returned handler can be used for adding rules that modify the metadata of depended-on software components.

### Method details

#### `Dependency` `add`(`String` configurationName, `Object` dependencyNotation)

Adds a dependency to the given configuration.

#### `Dependency` `add`(`String` configurationName, `Object` dependencyNotation, `Closure` configureClosure)

Adds a dependency to the given configuration, and configures the dependency using the given closure.

#### `void` `components`(``Action`<? super `ComponentMetadataHandler`>` configureAction)

Configures component metadata for this project.

This method executes the given action against the `ComponentMetadataHandler` for this project.

#### `void` `constraints`(``Action`<? super `DependencyConstraintHandler`>` configureAction)

Configures dependency constraint for this project.

This method executes the given action against the `DependencyConstraintHandler` for this project.

#### `Dependency` `create`(`Object` dependencyNotation)

Creates a dependency without adding it to a configuration.

#### `Dependency` `create`(`Object` dependencyNotation, `Closure` configureClosure)

Creates a dependency without adding it to a configuration, and configures the dependency using the given closure.

#### `ArtifactResolutionQuery` `createArtifactResolutionQuery`()

Creates an artifact resolution query.

This is a legacy API and is in maintenance mode. In future versions of Gradle, this API will be deprecated and removed. New code should not use this API. Prefer <UNHANDLED-LINK>ArtifactView.ViewConfiguration#withVariantReselection()</UNHANDLED-LINK> for resolving sources and javadoc.

#### `Dependency` `enforcedPlatform`(`Object` notation)

Declares a dependency on an enforced platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library. An enforced platform is a platform for which the direct dependencies are forced, meaning that they would override any other version found in the graph.

#### `Dependency` `enforcedPlatform`(`Object` notation, ``Action`<? super `Dependency`>` configureAction)

Declares a dependency on an enforced platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library. An enforced platform is a platform for which the direct dependencies are forced, meaning that they would override any other version found in the graph.

#### ``Provider`<`MinimalExternalModuleDependency`>` `enforcedPlatform`(``Provider`<`MinimalExternalModuleDependency`>` dependencyProvider)

Configures this dependency provider to select the enforced-platform variant of the target component

#### ``Provider`<`MinimalExternalModuleDependency`>` `enforcedPlatform`(``ProviderConvertible`<`MinimalExternalModuleDependency`>` dependencyProviderConvertible)

Configures this dependency provider to select the enforced-platform variant of the target component

#### `Dependency` `gradleApi`()

Creates a dependency on the API of the current version of Gradle.

#### `Dependency` `gradleTestKit`()

Creates a dependency on the Gradle test-kit API.

#### `Dependency` `localGroovy`()

Creates a dependency on the Groovy that is distributed with the current version of Gradle.

#### `void` `modules`(``Action`<? super `ComponentModuleMetadataHandler`>` configureAction)

Configures module metadata for this project.

This method executes the given action against the `ComponentModuleMetadataHandler` for this project.

#### `Dependency` `platform`(`Object` notation)

Declares a dependency on a platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library.

#### `Dependency` `platform`(`Object` notation, ``Action`<? super `Dependency`>` configureAction)

Declares a dependency on a platform. If the target coordinates represent multiple potential components, the platform component will be selected, instead of the library.

#### ``Provider`<`MinimalExternalModuleDependency`>` `platform`(``Provider`<`MinimalExternalModuleDependency`>` dependencyProvider)

Configures this dependency provider to select the platform variant of the target component

#### ``Provider`<`MinimalExternalModuleDependency`>` `platform`(``ProviderConvertible`<`MinimalExternalModuleDependency`>` dependencyProviderConvertible)

Configures this dependency provider to select the platform variant of the target component

#### `Dependency` `project`(``Map`<`String`, ?>` notation)

Creates a dependency on a project.

#### `void` `registerTransform`(``Class`<? extends `TransformAction`<`T`>>` actionType, ``Action`<? super `TransformSpec`<`T`>>` registrationAction)

Registers an artifact transform.

The registration action needs to specify the `from` and `to` attributes. It may also provide parameters for the transform action by using `TransformSpec.parameters(org.gradle.api.Action)`.

For example:

    // You have a transform action like this:
    abstract class MyTransform implements TransformAction<Parameters> {
        interface Parameters extends TransformParameters {
            @Input
            Property<String> getStringParameter();
            @InputFiles
            ConfigurableFileCollection getInputFiles();
        }

        void transform(TransformOutputs outputs) {
            // ...
        }
    }

    // Then you can register the action like this:

    def artifactType = Attribute.of('artifactType', String)

    dependencies.registerTransform(MyTransform) {
        from.attribute(artifactType, "jar")
        to.attribute(artifactType, "java-classes-directory")

        parameters {
            stringParameter.set("Some string")
            inputFiles.from("my-input-file")
        }
    }