<?xml version="1.0" encoding="UTF-8"?>
<?asciidoc-toc maxdepth="2"?>
<?asciidoc-numbered?>
<article xmlns="http://docbook.org/ns/docbook" xmlns:xl="http://www.w3.org/1999/xlink" version="5.0" xml:lang="en">
<info>
<title>Version Recommender Plugin</title>
<date>2019-02-19</date>
</info>
<note>
<simpara>Version 2 of this plugin will only work with Gradle 4 and JDK 8.</simpara>
</note>
<section xml:id="asciidocsummary">
<title>Summary</title>
<simpara>With this plugin it is possible to maintain the version of dependencies in other sources. This plugin helps to handle the version of dependencies in large projects with a lot of multi projects consistent It allows to leave the version number empty in your
project configuration. The following version recommendation providers are available:</simpara>
<itemizedlist>
<listitem>
<simpara>Ivy file</simpara>
</listitem>
<listitem>
<simpara>Maven pom / bom file</simpara>
</listitem>
<listitem>
<simpara>Properties file</simpara>
</listitem>
<listitem>
<simpara>Static properties</simpara>
</listitem>
</itemizedlist>
<simpara>Depending on the kind of version provider it is possible to run automatic updates on request. In addition this plugin
provides an extension to create Ivy or BOM file filters.</simpara>
<note>
<simpara>This plugin should always be applied to the root project.</simpara>
</note>
</section>
<section xml:id="asciidocusage">
<title>Usage</title>
<simpara>To use the Version Recommender plugin provided by Intershop, include the following code snippet into the build script of your <emphasis role="strong">root</emphasis> project:</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">plugins {
    id 'com.intershop.gradle.versionrecommender' version '2.4.0'
}

versionRecommendation {
    provider {
        ivy('ivy_name', 'org.company:ivyfilter:1.0.0') {}
    }
    updateConfiguration {
        ivyPattern = '[organisation]/[module]/[revision]/[type]s/ivy-[revision].xml'

        defaultUpdateProvider = ['ivy_name']
    }
}</programlisting>
</para>
</formalpara>
</section>
<section xml:id="asciidoctasks">
<title>Tasks</title>
<simpara>The Version Recommender plugin adds the following tasks to the project:</simpara>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="263*"/>
<thead>
<row>
<entry align="left" valign="top">Task name</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara>setLocal<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>setLocalVersion</simpara></entry>
<entry align="left" valign="top"><simpara>This task adds <literal>'LOCAL'</literal> to the version of an dependency configuration
of a provider <emphasis>&#8217;[ProviderName]'`</emphasis>. For a properties file provider all configured versions will be extended with <literal>'LOCAL'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>setSnapshot<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>setSnapshotVersion</simpara></entry>
<entry align="left" valign="top"><simpara>Does the same as <literal>'setLocal<emphasis>[ProviderName]</emphasis>'</literal> but with <literal>'SNAPSHOT'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>set<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>setVersion</simpara></entry>
<entry align="left" valign="top"><simpara>This sets a version from a project property to the
dependency of the provider <emphasis>&#8217;[ProviderName]'`</emphasis>. The project property is: <literal>'<emphasis>[ProviderName]</emphasis>Version'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>update<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>UpdateVersion</simpara></entry>
<entry align="left" valign="top"><simpara>An update of the version of a dependency of provider <emphasis>&#8217;[ProviderName]'`</emphasis>
can be started with this task. The update functionality can be configured in the closure <literal>updateConfiguration</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>store<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>StoreUpdateVersion</simpara></entry>
<entry align="left" valign="top"><simpara>Store the temporary changes to the configuration directory.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>reset<emphasis>[ProviderName]</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>ResetVersion</simpara></entry>
<entry align="left" valign="top"><simpara>The temporary changes will be removed.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>update</simpara></entry>
<entry align="left" valign="top"><simpara>Update</simpara></entry>
<entry align="left" valign="top"><simpara>An update for configured providers can be started with this task.
These providers can be configured with <literal>'defaultUpdateProvider'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>setVersion</simpara></entry>
<entry align="left" valign="top"><simpara>SetAllVersion</simpara></entry>
<entry align="left" valign="top"><simpara>This task sets a version from a project property to a provider which is
configured in <literal>'defaultUpdateProvider'</literal>. If a project property <literal>'<emphasis>[ProviderName]</emphasis>Version'</literal> is configured, this setting is
used. <emphasis role="strong">Do not <literal>store</literal> this configuration.</emphasis></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>store</simpara></entry>
<entry align="left" valign="top"><simpara>StoreUpdate</simpara></entry>
<entry align="left" valign="top"><simpara>Temporary changes of configured providers will be stored in the
configuration directory with this task. These providers can be configured with <literal>'defaultUpdateProvider'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara>reset</simpara></entry>
<entry align="left" valign="top"><simpara>ResetAllVersion</simpara></entry>
<entry align="left" valign="top"><simpara>This task removes all temporary changes of all providers.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<simpara>All tasks are part of the package <literal>'com.intershop.gradle.versionrecommender.tasks'</literal>.</simpara>
<simpara>The tasks are only available for filters with an dependency configuration or for the property filter configuration if
the file is located in the project directory. Temporary version configuration will be stored in files in a working
directory, which is per default located in the build directory of the root project.
The file name of this configuration is <literal>'.<emphasis>[providerType][ProviderName]</emphasis>.version'</literal>, e.g., <literal>.ivyProviderName.version</literal>.</simpara>
</section>
<section xml:id="asciidocsave-update-changes-to-the-source-control-system">
<title>Save update changes to the source control system</title>
<simpara>If the tasks <literal>store</literal> or <literal>store<emphasis>[ProviderName]</emphasis></literal> should save the changes also to the used version control system, it is
necessary to set a project property <literal><emphasis role="strong">scmCommit</emphasis></literal> to <literal>true</literal>. This plugin supports Subversion with over http(s) with basic
authentication and Git over http(s) with basic authenticationand and over ssh with an authentication with an private key.
The required credentials must be provided. It is possible to specify project properties, system variables or Java system properties.</simpara>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="69*"/>
<colspec colname="col_2" colwidth="69*"/>
<colspec colname="col_3" colwidth="265*"/>
<thead>
<row>
<entry align="left" valign="top">System variable or Java system property</entry>
<entry align="left" valign="top">Project property</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">SCM_USERNAME</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><emphasis role="strong">scmUserName</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>This is the username of a basic authentication for Subversion or Git over http(s).</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">SCM_PASSWORD</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><emphasis role="strong">scmUserPasswd</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>This is the password of a basic authentication for Subversion or Git over http(s).</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">SCM_KEYFILE</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><emphasis role="strong">scmKeyFile</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>This is the path to the keyfile of an authentication for Git over ssh.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">SCM_KEYPASSPHRASE</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><emphasis role="strong">scmKeyPassphrase</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>This is the optional passphrase for the keyfile of an authentication for Git over ssh.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocproject-extension-versionrecommendation">
<title>Project Extension 'versionRecommendation'</title>
<simpara>This plugin adds an extension <emphasis role="strong"><literal>versionRecommendation</literal></emphasis> to the root project. This extension contains the
plugin configuration for the version recommendation and also for the update functionality.</simpara>
<section xml:id="asciidocmethods">
<title>Methods</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="263*"/>
<thead>
<row>
<entry align="left" valign="top">Method</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">provider</emphasis>(Closure)</simpara></entry>
<entry align="left" valign="top"><simpara><link linkend="provider">RecommendationProviderContainer</link></simpara></entry>
<entry align="left" valign="top"><simpara>This method configures the container of all providers.
The order of items depends on the order in the build configuration</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">updateConfiguration</emphasis>(Closure)</simpara></entry>
<entry align="left" valign="top"><simpara><link linkend="updateConfiguration">UpdateConfiguration</link></simpara></entry>
<entry align="left" valign="top"><simpara>This method configures the update configuration.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocattributes">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">forceRecommenderVersion</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>boolean</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>false</literal></simpara></entry>
<entry align="left" valign="top"><simpara>If set to <literal>true</literal>, the version is always taken from
the version recommendation. This will override configured versions in dependencies.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">excludeProjectsbyName</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>List&lt;String&gt;</simpara></entry>
<entry align="left" valign="top"><simpara>[]</simpara></entry>
<entry align="left" valign="top"><simpara>This projects are excluded from the version recommendation configuration.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<section xml:id="asciidocprovider-configuration-provider-recommendationprovidercontainer">
<title><anchor xml:id="provider" xreflabel="[provider]"/>Provider configuration 'provider' (<literal>RecommendationProviderContainer</literal>)</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="263*"/>
<thead>
<row>
<entry align="left" valign="top">Method</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">ivy</emphasis>(String, Object, Closure)</simpara></entry>
<entry align="left" valign="top"><simpara>IvyRecommendationProvider</simpara></entry>
<entry align="left" valign="top"><simpara>Adds an Ivy based recommendation provider</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">pom</emphasis>(String, Object, Closure)</simpara></entry>
<entry align="left" valign="top"><simpara>MavenRecommendationProvider</simpara></entry>
<entry align="left" valign="top"><simpara>Adds a Pom based recommendation provider</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">properties</emphasis>(String, Object, Closure)</simpara></entry>
<entry align="left" valign="top"><simpara>PropertiesRecommendationProvider</simpara></entry>
<entry align="left" valign="top"><simpara>Adds a properties file base recommendation provider</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">properties</emphasis>(String, Closure)</simpara></entry>
<entry align="left" valign="top"><simpara>PropertiesRecommendationProvider</simpara></entry>
<entry align="left" valign="top"><simpara>Adds a property configuration with a map</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">getVersion</emphasis>(String, String)</simpara></entry>
<entry align="left" valign="top"><simpara>String</simpara></entry>
<entry align="left" valign="top"><simpara>Returns a version from the provider list configuration or null</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<simpara>The first parameter is always the name of the provider. It is used for project properties and tasks.</simpara>
<simpara>The second parameter is the input of the provider. The following inputs are possible:</simpara>
<itemizedlist>
<listitem>
<simpara><emphasis role="strong">Dependency</emphasis></simpara>
<itemizedlist>
<listitem>
<simpara>This can be a Map, eg. <literal>[group: 'com.company', name: 'module', version: 'version']</literal>, or<?asciidoc-br?>
a String, e.g., <literal>com.company:module:version</literal></simpara>
</listitem>
<listitem>
<simpara>It is possible to leave the version empty, so that the provider is not used per default. With <literal>'set[ProviderName]'</literal>
it is possible to enable this provider with a specific version.</simpara>
</listitem>
<listitem>
<simpara>The version can be adapted for this input configuration, with <literal>'set[ProviderName]'</literal>, <literal>'setLocal[ProviderName]'</literal>,
<literal>'setSnapshot[ProviderName]'</literal> and <literal>'update[ProviderName]'</literal>.</simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara><emphasis role="strong">URL</emphasis></simpara>
<itemizedlist>
<listitem>
<simpara>Configuration for direct access via URL.</simpara>
</listitem>
<listitem>
<simpara>The version for this configuration is not adaptable.</simpara>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<simpara><emphasis role="strong">File</emphasis></simpara>
<itemizedlist>
<listitem>
<simpara>This is the configuration for a special file. This file should be part of the project.</simpara>
</listitem>
<listitem>
<simpara>If this is specified for a properties provider, the versions inside of the file are adaptable and
selected properties can be excluded with a configuration if necessary.</simpara>
</listitem>
</itemizedlist>
</listitem>
</itemizedlist>
<section xml:id="asciidocivy-recommendation-provider">
<title>Ivy Recommendation Provider</title>
<simpara>The Ivy recommendation provider uses an Ivy file to create a map with modules and versions. All dependency
configurations are used and Ivy configurations are not considered. Of course it is possible to configure this provider
also with an URL or with a file definition, but a dependency definition should be the most common configuration for this provider.
The dependency configuration of the provider is also added to the version map of the provider.</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">versionRecommendation {
    provider {
        ivy('providerName', 'org.company:ivyfilter:1.0.0') {}
        ivy('providerName', [group: 'org.company', name: 'versions', version: '1.0.0']) {
            transitive = true
            overrideTransitiveDeps = false
            versionMap = [ 'com.company:componet1':'1.0.0' ]

            workingDir = new File(project.buildDir, 'providerWorkingDir')
            configDir = file('providerName')
        }
    }
}</programlisting>
</para>
</formalpara>
<simpara>This provider can be used with additional properties.</simpara>
<section xml:id="asciidocattributes-2">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">transitive</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>boolean</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>false</literal></simpara></entry>
<entry align="left" valign="top"><simpara>If set to <literal>true</literal>, all dependencies from the Ivy file will be resolved transitive.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">overrideTransitiveDeps</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>boolean</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>false</literal></simpara></entry>
<entry align="left" valign="top"><simpara>If set to <literal>true</literal>, the provider will override a previous version for a module if it
finds a later version of that very module via a transitive dependency.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">versionMap</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>Map&lt;String, String&gt;</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>[:]</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The entries of this map will be added at the end of the
existing map. This version map can also contain patterns for the key, e.g., <literal>'com.company:*'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">workingDir</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>buildDir/versionRecommendation</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This directory is used for temporary version files.
The name of this file is <literal>'.ivy[ProviderName].version'</literal>. This version configuration will overwrite the build script and the
configuration in the configuration directory.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">configDir</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara>projectDir</simpara></entry>
<entry align="left" valign="top"><simpara>This directory is used for persistent version files. The name
of this file is <literal>'.ivy[ProviderName].version'</literal>. This version configuration will overwrite the build script configuration.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section xml:id="asciidocpom-recommendation-provider">
<title>Pom Recommendation Provider</title>
<simpara>The Maven recommendation provider uses a Maven Bom file to create a map with modules and versions. All dependency
configurations are used and a scope is not considered. Of course it is possible to configure this provider
also with an URL or with a file definition, but a dependency definition should be the most common configuration for this provider.
All dependencies are resolved transitive and the dependency configuration of the provider is also added to the version map of the provider.</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">versionRecommendation {
    provider {
        pom('providerName', 'org.company:bomfilter:1.0.0') {}
        pom('providerName', [group: 'org.company', name: 'versions', version: '1.0.0']) {
            versionMap = [ 'com.company:componet1':'1.0.0' ]

            workingDir = new File(project.buildDir, 'providerWorkingDir')
            configDir = file('providerName')
        }
    }
}</programlisting>
</para>
</formalpara>
<simpara>This provider can be used with additional properties.</simpara>
<section xml:id="asciidocattributes-3">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">versionMap</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>Map&lt;String, String&gt;</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>[:]</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The entries of this map will be added on the end of the
existing map. This version map can also contain patterns for the key, e.g., <literal>'com.company:*'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">workingDir</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>buildDir/versionRecommendation</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This directory is used for temporary version files.
The name of this file is <literal>'.pom[ProviderName].version'</literal>. This version configuration will overwrite the build script and the
configuration in the configuration directory.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">configDir</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara>projectDir</simpara></entry>
<entry align="left" valign="top"><simpara>This directory is used for persistent version files. The name
of this file is <literal>'.pom[ProviderName].version'</literal>. This version configuration will overwrite the build script configuration.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
<section xml:id="asciidocproperties-recommendation-provider">
<title>Properties Recommendation Provider</title>
<simpara>The properties recommendation provider uses a properties file to create a map with modules and versions. The format
of this property file is special, because a colon is allowed in the keys. Furthermore, the format and the order of all entries
will be preserved, if the file is changed by a task.</simpara>
<simpara>The input of this provider may also be an URL or dependency, but this input types are not supported by the tasks for version adaptions.</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">versionRecommendation {
    provider {
        properties('providerName', rootProject.file('version.properties')) {}
        properties('providerName', rootProject.file('3rdPartsVersion.properties')) {
            transitive = true
            overrideTransitiveDeps = false
            versionMap = [ 'com.company:componet1':'1.0.0' ]

            workingDir = new File(project.buildDir, 'providerWorkingDir')
        }
    }
}</programlisting>
</para>
</formalpara>
<simpara>It is also possible to specify static properties only with an properties provider configuration.</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">versionRecommendation {
    provider {
        properties('providerName') {
            versionMap = [ 'com.company:componet1':'1.0.0' ]
        }
    }
}</programlisting>
</para>
</formalpara>
<simpara>This provider can be used with additional properties.</simpara>
<section xml:id="asciidocattributes-4">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">changeExcludes</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>List&lt;String&gt;</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>[]</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The property keys that match to one of this items,
are not changed by <literal>'set[ProviderName]'</literal>, <literal>'setLocal[ProviderName]'</literal>, <literal>'setSnapshot[ProviderName]'</literal> and <literal>'update[ProviderName]'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">versionMap</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>Map&lt;String, String&gt;</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>[:]</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The entries of this map will be added at the end of the
existing map. This version map can also contain patterns for the key, e.g., <literal>'com.company:*'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">workingDir</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>buildDir/versionRecommendation</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This directory is used for temporary property files.
The name of this file is the configured one. This version configuration will overwrite the configuration in the configuration directory.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
</section>
<section xml:id="asciidocupdate-configuration-updateconfiguration-updateconfiguration">
<title><anchor xml:id="updateConfiguration" xreflabel="[updateConfiguration]"/>Update Configuration 'updateConfiguration' (<literal>UpdateConfiguration</literal>)</title>
<simpara>This configuration configures the update functionality.</simpara>
<section xml:id="asciidocmethods-2">
<title>Methods</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="263*"/>
<thead>
<row>
<entry align="left" valign="top">Method</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">updateConfigItemContainer</emphasis>(Closure)</simpara></entry>
<entry align="left" valign="top"><simpara><link linkend="updateConfigItemContainer">UpdateConfigurationItem</link></simpara></entry>
<entry align="left" valign="top"><simpara>Configures an item configuration container</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">addConfigurationItem</emphasis>(UpdateConfigurationItem)</simpara></entry>
<entry align="left" valign="top"></entry>
<entry align="left" valign="top"><simpara>Adds an item to the configuration container</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">getUpdate</emphasis>(String, String, String)</simpara></entry>
<entry align="left" valign="top"><simpara>String</simpara></entry>
<entry align="left" valign="top"><simpara>Returns an updated version for a specified group, module name and the original version.
The paramters are <literal>group</literal>, <literal>name</literal>, <literal>version</literal>. It returns null if no newer version was found.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocattributes-5">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">ivyPattern</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara>''</simpara></entry>
<entry align="left" valign="top"><simpara>An Ivy pattern for Ivy Repositories. See <link xl:href="http://ant.apache.org/ivy/history/latest-milestone/concept.html">http://ant.apache.org/ivy/history/latest-milestone/concept.html</link>.
Without this pattern Ivy repositories will not be analyzed.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">updateLogFile</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>File</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>buildDir/<?asciidoc-br?>
versionRecommendation/<?asciidoc-br?>
update/update.log</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This file contains more detailed information.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">defaultUpdateProvider</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>List&lt;String&gt;</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>[]</literal></simpara></entry>
<entry align="left" valign="top"><simpara>A list of providers which will be updated if the task <literal>'update'</literal> runs.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">defaultUpdate</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>HOTFIX</literal></simpara></entry>
<entry align="left" valign="top"><simpara>String representation of <literal>updatePos</literal>. This attribute is
readable and writable. The following values are possible <literal>MAJOR</literal>, <literal>MINOR</literal>, <literal>PATCH</literal>, <literal>HOTFIX</literal> and <literal>NONE</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">updatePos</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>UpdatePos</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>UpdatePos.HOTFIX</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This attribute gives the value of <literal>defaultUpdate</literal> as <literal>UpdatePos</literal>
if the string can be converted. This is the default position for update tasks.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocupdate-configuration-itemupdateconfigurationitem">
<title><anchor xml:id="updateConfigItemContainer" xreflabel="[updateConfigItemContainer]"/>Update Configuration Item(<literal>UpdateConfigurationItem</literal>)</title>
<simpara>The order of the items is controlled by the container and is the alphabetical order of the names. The configuration is
assigned to the dependencies over the group and module name. It is possible to use patterns.</simpara>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">versionRecommendation {
    provider {... }
    updateConfiguration {
        ivyPattern = '[organisation]/[module]/[revision]/[type]s/ivy-[revision].xml'

        updateConfigItemContainer {
            updateJetty {
                org = 'org.eclipse.jetty'
                searchPattern = '\\.v\\d+'
            }
            updateGoogleAPI {
                org = 'com.google.apis'
                module = 'google-api-services-appsactivity'
                patternForNextVersion = '^(v1-rev)(\\d+)(-1\\.20\\.0)$'
                sortStringPos = 2
            }
        }
    }
}</programlisting>
</para>
</formalpara>
<simpara>The example configuration <literal>'updateJetty'</literal> will be used to update all dependencies to the organization <literal>'org.eclipse.jetty'</literal>.
<literal>'updateGoogleAPI'</literal> is used only for the update of <literal>'com.google.apis:google-api-services-appsactivity'</literal>.</simpara>
<section xml:id="asciidocattributes-6">
<title>Attributes</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="61*"/>
<colspec colname="col_4" colwidth="202*"/>
<thead>
<row>
<entry align="left" valign="top">Property</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Default value</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">org</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>''</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The pattern for the organization or group
If this attribute is empty this configuration matches in any case.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">module</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>''</literal></simpara></entry>
<entry align="left" valign="top"><simpara>The pattern for the module name or artifact ID
If this attribute is empty this configuration matches in any case.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">version</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>''</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This version is taken for the next update, if configured.</simpara></entry>
</row>
<row>
<entry align="left" valign="top" namest="col_1" nameend="col_4"><simpara>The following property is used for the update of extended sematic versions.<?asciidoc-br?>
See <link xl:href="https://github.com/IntershopCommunicationsAG/extended-version">https://github.com/IntershopCommunicationsAG/extended-version</link></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">update</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'HOTFIX'</literal></simpara></entry>
<entry align="left" valign="top"><simpara>String representation of <literal>updatePos</literal>. This attribute is
readable and writable. The following values are possible <literal>MAJOR</literal>, <literal>MINOR</literal>, <literal>PATCH</literal>, <literal>HOTFIX</literal> and <literal>NONE</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">updatePos</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>UpdatePos</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>UpdatePos.HOTFIX</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This attribute gives the value of update as <literal>UpdatePos</literal>
if the string can be converted. This is the default position for the update task.</simpara></entry>
</row>
<row>
<entry align="left" valign="top" namest="col_1" nameend="col_4"><simpara>The next attributes are used to configure the semantic version with special extensions, e.g., <literal>2.0.0.201206130900-r</literal></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">searchPattern</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>''</literal></simpara></entry>
<entry align="left" valign="top"><simpara>Search pattern for the extension, e.g., <literal>'\\.\\d+-r'</literal></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">versionPattern</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>searchPattern</literal></simpara></entry>
<entry align="left" valign="top"><simpara>If the extension of the current version is different,
it is possible to define a separate pattern.</simpara></entry>
</row>
<row>
<entry align="left" valign="top" namest="col_1" nameend="col_4"><simpara>For very special versions like special Google libs, e.g., <literal>v1-rev12-1.21.0</literal>, it is possible to use the next two attributes.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">patternForNextVersion</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>String</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>''</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This pattern helps to identify a special part of the version string for
comparison, e.g., <literal>'^(v1-rev)(\\d+)(-1\\.21\\.0)$'</literal></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">sortStringPos</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara><literal>int</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>0</literal></simpara></entry>
<entry align="left" valign="top"><simpara>This number specifies the selected group for comparison, e.g., <literal>2</literal>.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocexamples">
<title>Examples</title>
<itemizedlist>
<listitem>
<simpara>Extended semantic versions: <literal>1.0.0.0</literal>, <literal>1.0.0</literal>, <literal>1.0</literal>, <literal>1</literal></simpara>
</listitem>
<listitem>
<simpara>Extended semantic verisons with special extensions</simpara>
</listitem>
</itemizedlist>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="101*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="242*"/>
<thead>
<row>
<entry align="left" valign="top">Version Example</entry>
<entry align="left" valign="top">Search Pattern</entry>
<entry align="left" valign="top">Comment</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><literal>'1.2.0.201112221803-r'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'\\.\\d+-r'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'.201112221803-r'</literal> will be ignored and only <literal>'1.2.0'</literal> is used for comparison.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><literal>'9.2.9.v20150224'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'\\.v\\d+'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'.v20150224'</literal> will be ignored and only <literal>'9.2.9'</literal> is used for comparison.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
<itemizedlist>
<listitem>
<simpara>Special version strings</simpara>
</listitem>
</itemizedlist>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="4">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="141*"/>
<colspec colname="col_3" colwidth="20*"/>
<colspec colname="col_4" colwidth="162*"/>
<thead>
<row>
<entry align="left" valign="top">Version Example</entry>
<entry align="left" valign="top">Pattern</entry>
<entry align="left" valign="top">Pos</entry>
<entry align="left" valign="top">Comment</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><literal>'v1-rev12-1.21.0'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'^(v1-rev)(\\d+)(-1\\.21\\.0)$'</literal></simpara></entry>
<entry align="left" valign="top"><simpara>2</simpara></entry>
<entry align="left" valign="top"><simpara>Only <literal>12</literal> is used for comparison and update.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><literal>'v1-rev12-1.21.0'</literal></simpara></entry>
<entry align="left" valign="top"><simpara><literal>'^(v1-rev12)(-1\\.)(\\d+)(\\.0)$'</literal></simpara></entry>
<entry align="left" valign="top"><simpara>3</simpara></entry>
<entry align="left" valign="top"><simpara>Only <literal>21</literal> is used for comparison and update.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
</section>
</section>
</section>
</section>
<section xml:id="asciidocproject-extension-versionmanagement">
<title>Project Extension 'versionManagement'</title>
<simpara>This plugin adds an extension <literal>versionManagement</literal> to the root project. This extension contains methods that
add functionality to the publication configuration.</simpara>
<section xml:id="asciidocmethods-3">
<title>Methods</title>
<informaltable frame="all" rowsep="1" colsep="1">
<?dbhtml table-width="95%"?>
<?dbfo table-width="95%"?>
<?dblatex table-width="95%"?>
<tgroup cols="3">
<colspec colname="col_1" colwidth="81*"/>
<colspec colname="col_2" colwidth="61*"/>
<colspec colname="col_3" colwidth="263*"/>
<thead>
<row>
<entry align="left" valign="top">Method</entry>
<entry align="left" valign="top">Type</entry>
<entry align="left" valign="top">Description</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">withSubProjects</emphasis>(configure)</simpara></entry>
<entry align="left" valign="top"><simpara>List&lt;Project&gt; or Project</simpara></entry>
<entry align="left" valign="top"><simpara>A list of sub projects or a single sub project, e.g., <literal>'subprojects'</literal></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">fromConfigurations</emphasis>(configure)</simpara></entry>
<entry align="left" valign="top"><simpara>List&lt;String&gt; or String</simpara></entry>
<entry align="left" valign="top"><simpara>A list or a single configuration of the project, e.g., <literal>'compile'</literal>.</simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">withDependencies</emphasis>(configure)</simpara></entry>
<entry align="left" valign="top"><simpara>List&lt;String&gt; or String</simpara></entry>
<entry align="left" valign="top"><simpara>A list or a single string with a dependency configuration,
e.g., <literal>'com.company:module:version'</literal>.</simpara></entry>
</row>
</tbody>
</tgroup>
</informaltable>
</section>
<section xml:id="asciidocusage-2">
<title>Usage</title>
<section xml:id="asciidocivy-publishing">
<title>Ivy Publishing</title>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">plugins {
    id 'com.intershop.gradle.versionrecommender' version '2.4.0'
    id 'ivy-publish'
}

configurations { compile }

dependencies {
    compile 'commons-configuration:commons-configuration:1.6'
}

publishing {
    publications {
        ivyFilter(IvyPublication) {
            module 'ivy-filter'
            revision project.version

            // adds all sub projects
            versionManagement.withSubProjects { subprojects }

            // the transitive closure of this configuration will
            // be flattened and added to the dependency management section
            versionManagement.fromConfigurations { project.configurations.compile }

            // alternative syntax when you want to explicitly add a dependency with no transitives
            versionManagement.withDependencies { 'manual:dep:1' }

            // further customization of the POM is allowed if desired
            descriptor.withXml {
                asNode().info[0].appendNode('description',
                                            'A demonstration of IVY customization')
            }
        }
    }
    repositories {
        ivy {
            // change to point to your repo, e.g. http://my.org/repo
            url "$buildDir/repo"
            layout('pattern') {
                ivy '[organisation]/[module]/[revision]/[type]s/ivy-[revision].xml'
                artifact '[organisation]/[module]/[revision]/[ext]s/[artifact]-[type](-[classifier])-[revision].[ext]'
            }
        }
    }
}

repositories {
    jcenter()
}</programlisting>
</para>
</formalpara>
<simpara>Executing the Gradle publishing task will generate the following <emphasis>ivy.xml</emphasis> file.</simpara>
<formalpara>
<title>ivy.xml</title>
<para>
<programlisting language="xml" linenumbering="unnumbered">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;ivy-module version="2.0"&gt;
  &lt;info organisation="com.intershop" module="ivy-filter" revision="1.0.0" status="integration" publication="20170222210207"&gt;
    &lt;description&gt;A demonstration of IVY customization&lt;/description&gt;
  &lt;/info&gt;
  &lt;configurations/&gt;
  &lt;publications/&gt;
  &lt;dependencies defaultconfmapping="*-&amp;gt;default"&gt;
    &lt;!-- sub projects --&gt;
    &lt;dependency org="com.intershop" name="project1a" rev="1.0.0" conf="default"/&gt;
    &lt;dependency org="com.intershop" name="project2b" rev="1.0.0" conf="default"/&gt;
    &lt;!-- dependencies from configuration compile --&gt;
    &lt;dependency org="commons-digester" name="commons-digester" rev="1.8" conf="default"/&gt;
    &lt;dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="default"/&gt;
    &lt;dependency org="commons-lang" name="commons-lang" rev="2.4" conf="default"/&gt;
    &lt;dependency org="commons-configuration" name="commons-configuration" rev="1.6" conf="default"/&gt;
    &lt;dependency org="commons-beanutils" name="commons-beanutils" rev="1.7.0" conf="default"/&gt;
    &lt;dependency org="commons-collections" name="commons-collections" rev="3.2.1" conf="default"/&gt;
    &lt;dependency org="commons-beanutils" name="commons-beanutils-core" rev="1.8.0" conf="default"/&gt;
    &lt;!-- dependency --&gt;
    &lt;dependency org="manual" name="dep" rev="1" conf="default"/&gt;
  &lt;/dependencies&gt;
&lt;/ivy-module&gt;</programlisting>
</para>
</formalpara>
</section>
<section xml:id="asciidocmaven-publishing">
<title>Maven Publishing</title>
<formalpara>
<title>build.gradle</title>
<para>
<programlisting language="groovy" linenumbering="unnumbered">plugins {
    id 'com.intershop.gradle.versionrecommender' version '2.4.0'
    id 'maven-publish'
}

configurations { compile }

dependencies {
    compile 'commons-configuration:commons-configuration:1.6'
}

publishing {
    publications {
        mvnFilter(MavenPublication) {
            artifactId 'mvn-filter'
            version project.version

            // adds all sub projects
            versionManagement.withSubProjects { subprojects }

            // the transitive closure of this configuration will
            // be flattened and added to the dependency management section
            versionManagement.fromConfigurations { project.configurations.compile }

            // alternative syntax when you want to explicitly add a dependency with no transitives
            versionManagement.withDependencies { 'manual:dep:1' }

            // further customization of the POM is allowed if desired
            pom.withXml {
                asNode().appendNode('description',
                                    'A demonstration of maven customization')
            }
        }
    }
    repositories {
        maven {
            // change to point to your repo, e.g. http://my.org/repo
            url "$buildDir/repo"
        }
    }
}

repositories {
    jcenter()
}</programlisting>
</para>
</formalpara>
<simpara>Executing the Gradle publishing task will generate the following <emphasis>*.pom</emphasis> file.</simpara>
<formalpara>
<title>mvn-filter.pom</title>
<para>
<programlisting language="xml" linenumbering="unnumbered">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
  &lt;groupId&gt;com.intershop&lt;/groupId&gt;
  &lt;artifactId&gt;mvn-filter&lt;/artifactId&gt;
  &lt;version&gt;1.0.0&lt;/version&gt;
  &lt;packaging&gt;pom&lt;/packaging&gt;
  &lt;dependencyManagement&gt;
    &lt;dependencies&gt;
      &lt;!-- project dependencies --&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.intershop&lt;/groupId&gt;
        &lt;artifactId&gt;project1a&lt;/artifactId&gt;
        &lt;version&gt;1.0.0&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;com.intershop&lt;/groupId&gt;
        &lt;artifactId&gt;project2b&lt;/artifactId&gt;
        &lt;version&gt;1.0.0&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;!-- dependencies from configuration compile --&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-digester&lt;/groupId&gt;
        &lt;artifactId&gt;commons-digester&lt;/artifactId&gt;
        &lt;version&gt;1.8&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-logging&lt;/groupId&gt;
        &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;
        &lt;version&gt;1.1.1&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-lang&lt;/groupId&gt;
        &lt;artifactId&gt;commons-lang&lt;/artifactId&gt;
        &lt;version&gt;2.4&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-configuration&lt;/groupId&gt;
        &lt;artifactId&gt;commons-configuration&lt;/artifactId&gt;
        &lt;version&gt;1.6&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-beanutils&lt;/groupId&gt;
        &lt;artifactId&gt;commons-beanutils&lt;/artifactId&gt;
        &lt;version&gt;1.7.0&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-collections&lt;/groupId&gt;
        &lt;artifactId&gt;commons-collections&lt;/artifactId&gt;
        &lt;version&gt;3.2.1&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;commons-beanutils&lt;/groupId&gt;
        &lt;artifactId&gt;commons-beanutils-core&lt;/artifactId&gt;
        &lt;version&gt;1.8.0&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;!-- dependency --&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;manual&lt;/groupId&gt;
        &lt;artifactId&gt;dep&lt;/artifactId&gt;
        &lt;version&gt;1&lt;/version&gt;
      &lt;/dependency&gt;
    &lt;/dependencies&gt;
  &lt;/dependencyManagement&gt;
  &lt;description&gt;A demonstration of maven customization&lt;/description&gt;
&lt;/project&gt;</programlisting>
</para>
</formalpara>
</section>
</section>
<section xml:id="asciidoctest">
<title>Test</title>
<simpara>The integration tests using a test repositories. Therefore it is necessary to specify project properties for the test execution.</simpara>
<table frame="all" rowsep="1" colsep="1">
<title>Table Subversion test configuration</title>
<tgroup cols="3">
<colspec colname="col_1" colwidth="33.3333*"/>
<colspec colname="col_2" colwidth="33.3333*"/>
<colspec colname="col_3" colwidth="33.3334*"/>
<thead>
<row>
<entry align="left" valign="top">Test Property</entry>
<entry align="left" valign="top">Description</entry>
<entry align="left" valign="top">Value</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">svnurl</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>Root URL of the test project</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>SVNURL</literal></emphasis></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">svnuser</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>User name of Subversion test user</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>SVNUSER</literal></emphasis></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">svnpasswd</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>Password for Subversion test user</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>SVNPASSWD</literal></emphasis></simpara></entry>
</row>
</tbody>
</tgroup>
</table>
<table frame="all" rowsep="1" colsep="1">
<title>Table Git test configuration</title>
<tgroup cols="3">
<colspec colname="col_1" colwidth="33.3333*"/>
<colspec colname="col_2" colwidth="33.3333*"/>
<colspec colname="col_3" colwidth="33.3334*"/>
<thead>
<row>
<entry align="left" valign="top">Test Property</entry>
<entry align="left" valign="top">Description</entry>
<entry align="left" valign="top">Value</entry>
</row>
</thead>
<tbody>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">giturl</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>URL of the test project</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>GITURL</literal></emphasis></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">gituser</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>User name of Git test user</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>GITUSER</literal></emphasis></simpara></entry>
</row>
<row>
<entry align="left" valign="top"><simpara><emphasis role="strong">gitpasswd</emphasis></simpara></entry>
<entry align="left" valign="top"><simpara>Password for Git test user</simpara></entry>
<entry align="left" valign="top"><simpara>Must be specified with environment variable <emphasis role="strong"><literal>GITPASSWD</literal></emphasis></simpara></entry>
</row>
</tbody>
</tgroup>
</table>
</section>
</section>
<section xml:id="asciidocthanks">
<title>Thanks</title>
<simpara>Special thanks for the ideas to write this plugin:</simpara>
<itemizedlist>
<listitem>
<simpara><link xl:href="https://github.com/nebula-plugins/nebula-dependency-recommender-plugin">nebula-dependency-recommender-plugin</link></simpara>
</listitem>
<listitem>
<simpara><link xl:href="https://github.com/4finance/uptodate-gradle-plugin">com.ofg.uptodate</link></simpara>
</listitem>
<listitem>
<simpara><link xl:href="https://github.com/lkishalmi/gradle-bom-plugin">com.github.lkishalmi.bill-of-materials</link></simpara>
</listitem>
</itemizedlist>
</section>
<section xml:id="asciidoclicense">
<title>License</title>
<simpara>Copyright 2014-2016 Intershop Communications.</simpara>
<simpara>Licensed 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</simpara>
<simpara><link xl:href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</link></simpara>
<simpara>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.</simpara>
</section>
</article>