blob: 4af2be8372b82dc080ababf920d4a77890df5db1 [file] [log] [blame]
////
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`
|=======