# Interface ComponentMetadataHandler

@ServiceScope(org.gradle.internal.service.scopes.Scope.Project.class) public interface ComponentMetadataHandler
Allows the build to provide rules that modify the metadata of software components resolved from external repositories. Component metadata rules are applied in the components section of the dependencies block `DependencyHandler` of a build script. The rules can be defined in two different ways:

1. As an action directly when they are applied in the components section
2. As an isolated class implementing the `ComponentMetadataRule` interface

Example shows a basic way of removing certain transitive dependencies from one of our dependencies.

    plugins {
        id 'java'
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        components {
            withModule("jaxen:jaxen") {
                allVariants {
                    withDependencies {
                        removeAll { it.group in ["dom4j", "jdom", "xerces", "maven-plugins", "xml-apis", "xom"] }
                    }
                }

            }
        }
        implementation("jaxen:jaxen:1.1.3")
    }

Since:
  1.8

- ## Method Summary

  Modifier and Type
  Method
  Description
  `ComponentMetadataHandler`
  `all(Closure<?> rule)`
  Adds a rule closure that may modify the metadata of any resolved software component.
  `ComponentMetadataHandler`
  `all(Class<? extends ComponentMetadataRule> rule)`
  Adds a class based rule that may modify the metadata of any resolved software component.
  `ComponentMetadataHandler`
  `all(Class<? extends ComponentMetadataRule> rule, Action<? super ActionConfiguration> configureAction)`
  Adds a class based rule that may modify the metadata of any resolved software component.
  `ComponentMetadataHandler`
  `all(Object ruleSource)`
  Deprecated.
  Use `all(Action)` or `all(Class)` instead.
  `ComponentMetadataHandler`
  `all(Action<? super ComponentMetadataDetails> rule)`
  Adds a rule action that may modify the metadata of any resolved software component.
  `ComponentMetadataHandler`
  `withModule(Object id, Closure<?> rule)`
  Adds a rule that may modify the metadata of any resolved software component belonging to the specified module.
  `ComponentMetadataHandler`
  `withModule(Object id, Class<? extends ComponentMetadataRule> rule)`
  Adds a class based rule that may modify the metadata of any resolved software component belonging to the specified module.
  `ComponentMetadataHandler`
  `withModule(Object id, Class<? extends ComponentMetadataRule> rule, Action<? super ActionConfiguration> configureAction)`
  Adds a class based rule that may modify the metadata of any resolved software component belonging to the specified module.
  `ComponentMetadataHandler`
  `withModule(Object id, Object ruleSource)`
  Deprecated.
  Use `withModule(Object, Action)` or `withModule(Object, Class)` instead.
  `ComponentMetadataHandler`
  `withModule(Object id, Action<? super ComponentMetadataDetails> rule)`
  Adds a rule that may modify the metadata of any resolved software component belonging to the specified module.

- ## Method Details

  - ### all

    ComponentMetadataHandler all(Action<? super ComponentMetadataDetails> rule)
    Adds a rule action that may modify the metadata of any resolved software component.
    Parameters:
      `rule` - the rule to be added
    Returns:
      this
    Since:
      2.3

  - ### all

    ComponentMetadataHandler all(@DelegatesTo(ComponentMetadataDetails.class) Closure<?> rule)
    Adds a rule closure that may modify the metadata of any resolved software component.

    The supplied rule closure must declare a `ComponentMetadataDetails` as it's first parameter, allowing the component metadata to be modified.

    In addition, the rule can declare additional (read-only) parameters, which may provide extra details about the component. The order of these additional parameters is not significant.

    The following additional parameter types are supported:

    - `IvyModuleDescriptor` - additional Ivy-specific metadata. Rules declaring this parameter will only be invoked for components packaged as an Ivy module.
    - `PomModuleDescriptor` - additional Maven-specific metadata. Rules declaring this parameter will only be invoked for components packaged as a POM module.
    Parameters:
      `rule` - the rule to be added
    Returns:
      this
    Since:
      2.3

  - ### all

    @Deprecated ComponentMetadataHandler all(Object ruleSource)
    Deprecated.
    Use `all(Action)` or `all(Class)` instead.
    Adds a rule that may modify the metadata of any resolved software component.

    The ruleSource is an Object that has a single rule method annotated with `Mutate`.

    This rule method:

    - must return void.
    - must have `ComponentMetadataDetails` as the first parameter.
    - may have an additional parameter of type `IvyModuleDescriptor` or `PomModuleDescriptor`.
    Parameters:
      `ruleSource` - the rule source object to be added
    Returns:
      this
    Since:
      2.3

  - ### all

    ComponentMetadataHandler all(Class<? extends ComponentMetadataRule> rule)
    Adds a class based rule that may modify the metadata of any resolved software component.
    Parameters:
      `rule` - the rule to be added
    Returns:
      this
    Since:
      4.9

  - ### all

    ComponentMetadataHandler all(Class<? extends ComponentMetadataRule> rule, Action<? super ActionConfiguration> configureAction)
    Adds a class based rule that may modify the metadata of any resolved software component. The rule itself is configured by the provided configure action.
    Parameters:
      `rule` - the rule to be added
      `configureAction` - the rule configuration
    Returns:
      this
    Since:
      4.9

  - ### withModule

    ComponentMetadataHandler withModule(Object id, Action<? super ComponentMetadataDetails> rule)
    Adds a rule that may modify the metadata of any resolved software component belonging to the specified module.
    Parameters:
      `id` - the module to apply this rule to in "group:module" format or as a `ModuleIdentifier`
      `rule` - the rule to be added
    Returns:
      this
    Since:
      2.3

  - ### withModule

    ComponentMetadataHandler withModule(Object id, @DelegatesTo(ComponentMetadataDetails.class) Closure<?> rule)
    Adds a rule that may modify the metadata of any resolved software component belonging to the specified module.

    The rule closure parameter is subject to the same requirements as `all(groovy.lang.Closure)`.

    Parameters:
      `id` - the module to apply this rule to in "group:module" format or as a `ModuleIdentifier`
      `rule` - the rule to be added
    Returns:
      this
    Since:
      2.3

  - ### withModule

    @Deprecated ComponentMetadataHandler withModule(Object id, Object ruleSource)
    Deprecated.
    Use `withModule(Object, Action)` or `withModule(Object, Class)` instead.
    Adds a rule that may modify the metadata of any resolved software component belonging to the specified module.

    The rule source parameter is subject to the same requirements as `all(Object)`.

    Parameters:
      `id` - the module to apply this rule to in "group:module" format or as a `ModuleIdentifier`
      `ruleSource` - the rule source object to be added
    Returns:
      this
    Since:
      2.3

  - ### withModule

    ComponentMetadataHandler withModule(Object id, Class<? extends ComponentMetadataRule> rule)
    Adds a class based rule that may modify the metadata of any resolved software component belonging to the specified module.
    Parameters:
      `id` - the module to apply this rule to in "group:module" format or as a `ModuleIdentifier`
      `rule` - the rule to be added
    Returns:
      this
    Since:
      4.9

  - ### withModule

    ComponentMetadataHandler withModule(Object id, Class<? extends ComponentMetadataRule> rule, Action<? super ActionConfiguration> configureAction)
    Adds a class based rule that may modify the metadata of any resolved software component belonging to the specified module.
    Parameters:
      `id` - the module to apply this rule to in "group:module" format or as a `ModuleIdentifier`
      `rule` - the rule to be added
    Returns:
      this
    Since:
      4.9