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

[*__since 2.3__*]

From a set of jar artifacts, this task generates an OBR (OSGi Bundle Repository) descriptor. It could be then used by the link:../resolver/obr{outfilesuffix}[obr resolver].

The set of jars which will be described by OBR can be defined in 4 mutually exclusive ways:

* via an Ivy resolver: every jar listed by the resolver will be taken into account
* by defining a root directory: every jar found recursively in that folder will be taken into account
* via the name of an Ivy cache: every artifact contained in the cache will be taken into account
* (*__since 2.4__*) via a resolve: this task is a link:../use/postresolvetask{outfilesuffix}[post resolve task] (with all the behaviour and attributes common to all post resolve tasks), thus every artifact which has been resolved will be taken into account; it is especially useful for building a link:../osgi/target-platform{outfilesuffix}[target platform]

NB: among every listed file or artifact, only the actually OSGi bundles will be described by the OBR descriptor; the other files are ignored.

== Attributes

[*__since 2.4__*]

This is a link:../use/postresolvetask{outfilesuffix}[post resolve task], with all the behaviour and attributes common to all post resolve tasks.

[options="header",cols="15%,50%,35%"]
|=======
|Attribute|Description|Required
|out|the location of the descriptor file to generate|Yes
|resolverName|the name of the resolver from which the jars should be to gathered|No
|cacheName|the name of the cache from which the jars should be to gathered|No
|baseDir|the folder into which the jars should be gathered recursively|No
|sourceType|if used as a post resolve task, `sourceType` defines the type of artifacts which should be considered as source artifacts|No. Defaults to `source,sources,src`
|encoding|The encoding of the resulting XML file|No. Defaults to `UTF-8`
|indent|Specify if the XML result file should be indented|No. Defaults to `true`
|quiet|Log the rejected jars that are ill-formed as debug rather than warning|No. Defaults to `false`
|=======

== Examples

[source,xml]
----
    <ivy:buildobr baseDir="${eclipse.home}" out="${basedir}/target/repo-eclipse.xml" indent="true"/>
----

Builds an indented OBR descriptor from an Eclipse install, with their path relative to the Eclipse install.

'''

[source,xml]
----
    <ivy:configure file="ivysettings.xml"/>
    <ivy:buildobr resolverName="my-file-resolver" out="${basedir}/target/repo-eclipse.xml"/>
----

Configures Ivy settings and builds an OBR descriptor from jars resolved by the defined resolver.

'''

[source,xml]
----
    <ivy:configure file="ivysettings.xml"/>
    <ivy:buildobr cacheName="my-cache" out="${basedir}/target/repo-eclipse.xml"/>
----

Configures Ivy settings and builds an OBR descriptor from jars contained in the defined cache.

'''

[source,xml]
----
    <ivy:configure file="ivysettings.xml"/>
    <ivy:resolve file="ivy.xml"/>
    <ivy:buildobr out="${basedir}/target-platform-obr.xml"/>
----

Launches a resolve and then builds an obr.xml describing the resolved artifacts.
