////
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

     https://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
////

*Tag:* conflict *Parent:* link:../ivyfile/dependencies{outfilesuffix}[dependencies]

[*__since 2.0__*]

Specify a a conflict manager for one or several dependencies.
The way to specify a conflict manager is by giving indication to which dependencies the conflict manager applies (by giving organisation and module names or name regexp), and then specifying the conflict manager, either by giving its name or by specifying a fixed revision list, in which case a fixed conflict manager is used.

The list of built-in conflict managers available is listed on the link:../settings/conflict-managers.html[conflict manager settings page].

Conflict managers are used during the resolve operation, i.e. when Ivy analyses the graph of dependencies and downloads corresponding Ivy files and artifacts. Managing conflicts at resolve time minimizes downloads: when a module is evicted by a conflict manager, it is not downloaded.

There are two things optimized during conflict resolution: download of artifacts and download of Ivy files. The first is always ensured by Ivy, i.e. artifacts of a module evicted will never be downloaded. The second is not as simple to handle because in order to know what the conflicts are, Ivy needs to know the dependency graph, and in order to know the dependency graph, it has to download Ivy files. But Ivy is highly optimized for this too, and it tries to evict modules as soon as possible.
That's why the order of dependencies is important for download optimization. Indeed, Ivy traverses the dependency graph in the order in which dependencies are declared in the Ivy files, and each time it encounters a dependency on a module, it first checks if there is a conflict on this module, and if this is the case, it asks the conflict manager to resolve the conflict. Then if the module is evicted, it does not download its Ivy file, and the whole branch is not traversed, which can save a lot of time.

If no specific conflict manager is defined, a default conflict manager is used for all modules. The current default conflict manager is the `latest-revision` conflict manager.

== Attributes

[options="header",cols="15%,50%,35%"]
|=======
|Attribute|Description|Required
|org|the name, or an expression matching the name of organisation to which this conflict manager should apply (see `matcher` attribute below)|No, defaults to `$$*$$` (match all)
|module|the name, or an expression matching the name of module to which this conflict manager should apply (see `matcher` attribute below)|No, defaults to `$$*$$` (match all)
|manager|the name of the conflict manager to use
.2+.^|Exactly one of two
|rev|a comma separated list of revisions this conflict manager should select
|matcher|the link:../concept{outfilesuffix}#matcher[matcher] to use to match the modules for which the conflict manager should be used|No, defaults to `exact`
|=======
