  ------
  Release Notes
  ------
  Hervé Boutemy
  ------
  2010-07-19
  ------

~~ 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
~~
~~   http://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.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Maven Ant Tasks

* 2.1.1 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=11533&version=16024}issue management system}}, and is reproduced below.

** Bug

    * [MANTTASKS-173] - Value of project.build.finalName is not resolved

    * [MANTTASKS-178] - artifact:pom task not working with Ant 1.8.0

    * [MANTTASKS-179] - Variables nested in pom.xml are not being interpolated

    * [MANTTASKS-185] - null pointer exception when caching dependency information

    * [MANTTASKS-187] - maven ant tasks 2.1.0 pom task no longer extrapolates properties

    * [MANTTASKS-188] - dependencyrefsbuildfile attribute doesn't work with absolute paths.

    * [MANTTASKS-189] - NPE when using scope="system"

    * [MANTTASKS-190] - dependency scope attribute is not validated

    * [MANTTASKS-191] - No explanation of how to use multiple Maven repositories to resolve dependencies

    * [MANTTASKS-192] - NPE when using remoteRepository with refid which has not been defined

    * [MANTTASKS-193] - POM properties aren't available as ANT properties contrary to the documentation

    * [MANTTASKS-195] - Cannot override central repository with my own

** Improvement

    * [MANTTASKS-181] - update tasks code to use Java 5

** Wish

    * [MANTTASKS-172] - extend scope of 'result' variable in org.apache.maven.artifact.ant.DependenciesTask.doExecute()


* 2.1.0 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/ReleaseNote.jspa?projectId=11533&version=13522}issue management system}}, and is reproduced below.

** Bug

    * [MANTTASKS-4] - System scope not working properly in Maven Antlib

    * [MANTTASKS-152] - Mvn task omit localRepository param

    * [MANTTASKS-153] - Properties defined in Ant are not passed to Maven

    * [MANTTASKS-155] - Dependency fileset should set the current ant project

    * [MANTTASKS-159] - Wrong credentials used for mirrored repositories

    * [MANTTASKS-160] - Wrong metadata files created for mirrored remote repositories

    * [MANTTASKS-167] - Generated ant build file should save version list for version mapper

** Improvement

    * [MANTTASKS-117] - Setting Maven user-properties not possible

    * [MANTTASKS-169] - Dependencies "verbose" option should be deprecated in favor of standard ant verbose option

** New Feature

    * [MANTTASKS-151] - Support for artfacts that are 'classified' from birth

    * [MANTTASKS-156] - Add feature to dependencies task to write file paths to a file.

    * [MANTTASKS-168] - New task to write a pom file


* 2.0.10 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/IssueNavigator.jspa?reset=true&pid=11533&fixfor=14199}issue management system}}, and is reproduced below.

**Bug

    * [MANTTASKS-87] - Using a pom.xml for dependencies, in which the pom.xml has a parent pom.xml will cause a "Error downloading parent pom" error

    * [MANTTASKS-106] - Maven ant tasks artifact has maven inside the jar and so can't be used from inside the maven (maven-antrun-plugin) - classes do conflict

    * [MANTTASKS-111] - Support for SNAPSHOT deployment

    * [MANTTASKS-116] - NPE when install target is missing file and pom type is JAR

    * [MANTTASKS-142] - Default remote repository id not safe

    * [MANTTASKS-144] - "Error reading settings file" error is reported when settings.xml is deleted from maven/conf folder.

    * [MANTTASKS-145] - Dependency management doesn't work with pom and dependencies tasks

** Improvement

    * [MANTTASKS-35] - Support profiles in pom type

    * [MANTTASKS-114] - improve documentation

    * [MANTTASKS-146] - Improvements to site documentation

    * [MANTTASKS-147] - Improvements to scope filtering

** New Feature

    * [MANTTASKS-71] - running m2 inside Ant

    * [MANTTASKS-149] - Allow multiple types in the type filter


* 2.0.9 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/IssueNavigator.jspa?reset=true&pid=11533&fixfor=13935&sorter/field=issuekey&sorter/order=DESC}issue management system}}, and is reproduced below.

**Bug

    * [MANTTASKS-13] - Ant Tasks use of <authentication> is inconsistent

    * [MANTTASKS-91] - [task dependencies]Trouble between mvn and manttasks

    * [MANTTASKS-103] - Can't deploy to a file: repository

    * [MANTTASKS-104] - files returned in sourcesFileset when no dependencies sources available

    * [MANTTASKS-105] - dependencies task don't read remote repositories from settings xml

    * [MANTTASKS-107] - repository defined in pom not used to download parent pom when defining pom reference

    * [MANTTASKS-108] - Maven Ant Tasks are switching the Classloader of the Main Ant Thread

**Improvement

    * [MANTTASKS-88] - Add the ability to download javadoc dependencies


* 2.0.8 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/IssueNavigator.jspa?reset=true&pid=11533&fixfor=13618&sorter/field=issuekey&sorter/order=DESC}issue management system}}, and is reproduced below.

**Bug

    * [MANTTASKS-2] - artifact:dependencies related error: No files specified for filelist

    * [MANTTASKS-22] - artifact:dependencies does not respect in the generated classpath the order of the dependencies

    * [MANTTASKS-23] - antlib:deploy doesn't set correct snapshot version

    * [MANTTASKS-67] - artifact:deploy - The name of deploying element in snapshot repository is wrong

    * [MANTTASKS-77] - <offline> element of settings.xml ignored by artifact:dependencies.

    * [MANTTASKS-78] - unable to download a dependency when it is a SNAPSHOT and multiple remoteRepositories are used

    * [MANTTASKS-79] - add XML encoding support for pom.xml and settings.xml

    * [MANTTASKS-82] - Environment variables are not resolved in settings files

    * [MANTTASKS-84] - VersionMapper does not work on SNAPSHOT dependencies where uniqueVersion="true"

    * [MANTTASKS-85] - settings config ignored for remoteRepositories not defined in pom

    * [MANTTASKS-87] - Using a pom.xml for dependencies, in which the pom.xml has a parent pom.xml will cause a "Error downloading parent pom" error

    * [MANTTASKS-98] - NPE if user settings file doesn't exist

**Improvement

    * [MANTTASKS-33] - Pass Ant properties for resolved dependency JARs

    * [MANTTASKS-80] - weak/Inconsistent handling of settings

    * [MANTTASKS-97] - add support for <mirrorOf>*</mirrorOf>

    * [MANTTASKS-101] - get pom properties values like any other element


* 2.0.7 Release Notes

  <<Warning>>: there are 2 incompatible changes that you must know before upgrading, to fix your Ant build files:

    [[1]][MANTTASKS-44]: <<<\<localRepository path="..."/\>>>> instead of <<<\<localRepository location=""/\>>>> for Ant 1.7 compatibility
    (location attribute is used internally by Ant 1.7)

    [[2]][MANTTASKS-65]:  central repository is not automatically added any more if a remoteRepository is set: the code has been changed to work
    as expected and documented (explicit declaration)

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/IssueNavigator.jspa?reset=true&fixfor=13521&pid=11533&sorter/field=issuekey&sorter/order=DESC}issue management system}}, and is reproduced below.

**Bug

    * [MANTTASKS-1] - dependencies ant task incorrectly handles transitive snapshot dependencies

    * [MANTTASKS-6] - ant artifact doesn't read settings.xml

    * [MANTTASKS-11] - antlib + http based repository + version range errors badly

    * [MANTTASKS-12] - No means of preventing ant task from querying repo1.maven.org

    * [MANTTASKS-15] - scp:// urls not recognised, even when wagon-ssh is installed.

    * [MANTTASKS-18] - filesetId does not contain all dependencies when artifact was not yet locally installed

    * [MANTTASKS-26] - artifact:dependencies filesetId attribute causes NPE

    * [MANTTASKS-65] - [PATCH] add central repository only if no remoteRepository set

    * [MANTTASKS-70] - m2 tasks not reentrant

    * [MANTTASKS-75] - [PATCH] NPE if loaded settings.xml does not contain <localRepository>

**Improvement

    * [MANTTASKS-44] - bootstrap of components/trunk fails with ant-1.7.0RC1

    * [MANTTASKS-66] - [PATCH] add more information when Ant run in verbose mode (ant -v)

    * [MANTTASKS-69] - [PATCH] improve sample.build.xml

    * [MANTTASKS-72] - Remove hardcoded groupId in install-provider task

    * [MANTTASKS-76] - [PATCH] update Maven Ant Tasks to Maven core 2.0.7

**New Feature

    * [MANTTASKS-29] - more powerful filesetId

**Wish

    * [MANTTASKS-24] - Not enough diagnostics if failed to validate POM

    * [MANTTASKS-37] - The Dependencies task of Maven Antlib should override an existing path reference instead of failing

    * [MANTTASKS-73] - miss RemoteRepository sub-element for tasks pom and install-provider


* 2.0.6 Release Notes

  The full list of changes can be found in our {{{http://jira.codehaus.org/secure/IssueNavigator.jspa?reset=true&fixfor=13351&pid=11533&sorter/field=issuekey&sorter/order=DESC}issue management system}}, and is reproduced below.

**Bug

    * [MANTTASKS-7] - dependencies ant task does not handle scoped transitive dependencies correctly

    * [MANTTASKS-62] - Maven 2.0.5 needs Maven 2.0.5 Tasks for Ant and Maven 2.0.5 Embedder for everything to remain sane

**Improvement

    * [MANTTASKS-31] - [PATCH] Ant tasks should allow you to specify a custom location for settings.xml

**New Feature

    * [MANTTASKS-28] - [PATCH] add sourcesFilesetId attribute to dependencies task to download sources

    * [MANTTASKS-42] - Allow install and deploy tasks to include attached artifacts

**Task

    * [MANTTASKS-30] - rename maven-artifact-ant to maven-ant-tasks

**Wish

    * [MANTTASKS-45] - Document pomRefId attribute for M2 ant tasks on M2 website.
