////
   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:* manager *Parent:* link:../ivyfile/conflicts{outfilesuffix}[conflicts]

(*__since 2.0__*) the conflicts section is deprecated.  Use link:../ivyfile/conflict{outfilesuffix}[conflict] instead.

Specify 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.


See link:../ivyfile/conflicts{outfilesuffix}[Conflict Manager] for details on conflict managers in general.

== 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)
|name|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 (*__since 1.3__*)|No, defaults to `exactOrRegexp` in pre 1.3 Ivy files, and `exact` in 1.3 and superior
|=======
