Changes from Ant 1.10.9 TO Ant 1.10.10
======================================

Fixed bugs:
-----------

 * SCP (with sftp=true) task would fail if fetching file located in root directory
   Bugzilla Report 64742

Other changes:
--------------

 * javaversion condition now has a new "atmost" attribute. See the javaversion
   manual for more details

 * The "listener" nested element of the "junitlauncher" task now has a new
   "useLegacyReportingName" attribute which can be used to control the test
   identifiers names that get reported by the listener. See the junitlauncher
   manual for more details.
   Note that this change also introduces a new "setUseLegacyReportingName" method
   on the org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter
   interface. This will break backward compatibility with any of your custom
   result formatters which implemented this interface and such implementations
   are now expected to implement this new method.

 * a new attribute preserveduplicates allows <resourcelist> to return
   the same resource multiple times when set to true.
   Bugzilla Report 64854

 * a new attribute filterbeforeconcat in <concat> can be used to
   decide whether the filterchain should be applied to the
   concatenated content (the default) or each nested resource
   individually before concatenating them.
   Bugzilla Report 64855

Changes from Ant 1.10.8 TO Ant 1.10.9
=====================================

Fixed bugs:
-----------

 * the ftp task could throw a NullPointerException if an error occured
   Bugzilla Report 64438

 * propertyset now also sees in-scope local properties
   Bugzilla Report 50179

 * replaced our version of ReaderInputStream with the battle-tested
   version of Apache Commons IO as our version had problems with
   surrogate pairs (and likely other edge cases as well).
   Bugzilla Report 40455

 * <fixcrlf> will no longer remove the temporary file it just created
   before writing to it.

 * <sshexec> and <scp> didn't deal with wildcard hostnames in ssh
   config files properly.
   Bugzilla Report 64530

Other changes:
--------------

 * Ant will no longer log a warning if it doesn't find tools.jar
   Bugzilla Report 63577

 * the <jar> task accepts now a nested <indexjarsmapper> element
   that can be used to perform custom filename transformations
   for the <indexjars> archives.
   Github Pull Request #134

 * added a new PropertyEnumerator interface that extensions can
   provide if they are managing properties unknown to the Ant project.

 * added some special code to support GraalVM JavaScript as
   javax.script scripting engine for JavaScript. In particular we
   relax some security settings of GraalVM so that scripts can access
   Ant objects.

   Also Ant enables Nashorn compatibility mode by default, you can
   disable that by setting the magic Ant property
   ant.disable.graal.nashorn.compat to true.

   See the script task manual for additional details.

 * If the magic property ant.tmpdir hasn't been set and Ant can
   control the permissions of directories it creates it will create an
   owner-owned temporary directory unaccessible to others as default
   tempdir as soon as a temporary file is created for the first time,

Changes from Ant 1.10.7 TO Ant 1.10.8
=====================================

Fixed bugs:
-----------

 * "legacy-xml" formatter of junitlauncher task wasn't writing out
   the stacktrace for failures. This is now fixed.
   Bugzilla Report 63827

 * sshexec failed to write output to a file if the file didn't exist

 * Fixes a regression in javac task involving command line argument
   files.
   Bugzilla Report 63874

 * sshexec, sshsession and scp now support a new sshConfig parameter.
   It specified the SSH configuration file (typically ${user.home}/.ssh/config)
   defining the username and keyfile to be used per host.

 * "legacy-xml" formatter of junitlauncher task wasn't writing out
   exceptions that happen in @BeforeAll method of a test. This is now fixed.
   Bugzilla Report 63850

 * Building Ant from source could result in the javadocs target failing if the
   optional dependencies were missing. This has now been fixed.
   Bugzilla Report 63438

 * Fixes a potential ConcurrentModificationException in XMLLogger.
   Bugzilla Report 63921

 * Fixes a bug in junitlauncher task in forked mode, where if a listener element
   was used as a sibling element for either the test or testclasses element,
   then the forked mode launch would fail.
   Bugzilla Report 63958

 * Fixes an issue in AntStructure where an incorrect DTD was being generated.
   Github Pull Request #116

 * Fixes an incorrect variable name usage in junit-frames-xalan1.xsl.
   Github Pull Request #117

Other changes:
--------------

 * org.apache.tools.mail.MailMessage will now send a fully qualified
   domain name in its HELO message.
   Github Pull Request #101

 * The runant.py script should now work with Python 3.
   Github Pull Request #96

 * tstamp task now honors SOURCE_DATE_EPOCH environment variable for
   reproducible builds (https://reproducible-builds.org/specs/source-date-epoch/#idm55)
   Bugzilla Report 62617

 * rmic has been removed from Java 15. The task will now throw an
   exception if you try to use it while running Java 15 or newer.

 * a new property ant.tmpdir provides improved control over the
   location Ant uses to create temporary files

Changes from Ant 1.10.6 TO Ant 1.10.7
=====================================

Fixed bugs:
-----------

 * FTP still tries checking or entering directories after a timeout
   Bugzilla Report 63454

 * junitlauncher - does not detect failure in @BeforeAll
   Bugzilla Report 63479

 * Error using ant-1.10.6 with jdk8
   Bugzilla Report 63457

 * FTP task no longer duplicates a check for a file being a symlink.
   Bugzilla Report 63259

 * junitlauncher task, when used in fork mode with "<testclasses>",
   used to create the wrong number of listeners per test class. This
   has now been fixed.
   Bugzilla Report 63446

 * The "legacy-xml" junitlauncher task's listener would not include
   @ParameterizedTest testcases in its XML report file. This has now
   been fixed.
   Bugzilla Report 63680

Other changes:
--------------

 * FTP task timeout improvements.
   Bugzilla Reports 63252 and 47414

 * junitlauncher task now supports selecting test classes for execution,
   based on the JUnit 5 tags, through the new "includeTags" and
   "excludeTags" attributes.

 * prefer https over http when building ant itself, and in the ant 
   documentation and sources

 * changed the references and Maven coordinates of JavaMail dependency
   to Jakarta Mail and thus javax.mail to jakarta.mail - and upgraded
   the dependency to 1.6.3.

Changes from Ant 1.10.5 TO Ant 1.10.6
=====================================

Changes that could break older environments:
-------------------------------------------

 * image task no longer works on Java 9+ because internal classes
   supporting Java Advanced Imaging are removed; imageio task (based on
   ImageIO and AWT) is provided as a replacement.

 * junitlauncher task has changed the class names and package names of
   the task as well as some of the supporting classes of that task. If
   any code depended on these class or package names, they will have to
   be updated to reference these newly named classes. This however,
   doesn't impact build scripts if their reference to junitlauncher task
   was merely through the use of the <junitlauncher> element.

 * ClearCase#runS has been augmented by a two arg-version and the
   one-arg version will no longer be called. This may affect
   subclasses that have overridden runS.

Fixed bugs:
-----------

 * fetch.xml must retrieve runtime rather than compile dependencies for
   mail task.
   Bugzilla Report 62621

 * Fixes an issue in junitreport task, which used to throw a
   java.net.MalformedURLException when saxon was used on Windows OS.
   Bugzilla Report 62594

 * augment task now throws a BuildException (as noted in its manual)
   instead of a IllegalStateException in the absence of the "id" attribute.
   Bugzilla Report 62655

 * org.apache.tools.zip.ZipOutputStream would sometimes potentially use
   an incorrect compression level for a zip entry. This is now fixed.
   Bugzilla Report 62686

 * sync task, in some cases on case insensitive file systems, would consider
   a file in a destination directory to be orphaned and would delete it.
   This task has now been fixed to infer the case sensitivity of the filesystem
   of the destination directory.
   Bugzilla Report 62890

 * Fixes a potential java.util.ConcurrentModificationException in
   org.apache.tools.ant.Project#getCopyOfReferences.
   Github Pull Request #81

 * cccheckout would ignore an error of the "ls checkout" command even
   if failOnError was set to false.
   Bugzilla Report 63071

 * The isreachable condition could in some cases return true even if the
   actual address could potentially be unreachable. This is now fixed
   and the resolved address is actually checked for reachability.

 * Fixes an issue where scp transfer completion tracking wasn't being
   triggered for 100% completion.
   Github Pull Request #91


Other changes:
--------------
 * generatekey task now supports SubjectAlternativeName during key
   generation.

 * the <modified> selector has a new built-in algorithm 'lastmodified'
   which computes a value based upon the lastmodified time of the file.

 * junitlauncher task now supports running tests in a forked JVM. More
   details available in the junitlauncher task manual.

 * signjar and verifyjar now support the -providerName, -providerClass
   and -providerArg command line options of keytool via new attributes.
   Bugzilla Report 65234

 * signjar and verifyjar now supported nested <arg> elements for
   command line arguments that are not supported explicitly by the
   tasks via attributes.

 * added several attributes to <javadoc> that support modules.
   Bugzilla Report 62424

 * properties used or set by BuildFileTask/BuildFileRule are documented
   in MagicTestNames. A new magic property, ant.test.basedir.ignore, is
   introduced for cases where Ant projects set up for test purposes
   must ignore basedir set externally by test harness.

 * a new CharSet type is provided for encoding or charset attributes in
   tasks that must deal with different character encodings in files,
   file names and other string resources.

 * org.apache.tools.ant.AntClassLoader is now multi-release jar aware.
   Starting Java 9, jar files can be packaged as multi-release jars,
   AntClassLoader now recognizes such multi-release jar files while
   loading resources at runtime in Java 9+ runtime environments.
   Bugzilla Report 62952

 * Added jmod and link tasks, to support jmod and jlink tools of JDK 9+.
   Github Pull Request #80

 * Jsch library dependency has now been upgraded to 0.1.55. Jsch is
   the library behind the sshexec and scp Ant tasks.
   Github Pull Request #84

 * The "http" condition, now has a "readTimeout" attribute which can be
   used to control the amount of time to wait for the read to complete.
   Bugzilla Report 63193

 * ftp task manual has been updated to mention that the remote listing of
   files honours the followsymlinks attribute.
   Bugzilla Report 63226


Changes from Ant 1.10.4 TO Ant 1.10.5
=====================================

Fixed bugs:
-----------

 * Fixes a regression in the "get" task where redirects
   from a HTTP resource to a HTTPS resource started throwing
   an exception.
   Bugzilla Report 62499

 * the new allowFilesToEscapeDest didn't work when set to false and
   archive entries contained relative paths with so many ".."
   segnments that the resulting path would go beyond the file system
   root.
   Bugzilla Report 62502

Other changes:
--------------
 * Java task now accepts a "sourcefile" attribute to allow single file
   source program execution, a feature that is introduced in Java 11.

Changes from Ant 1.10.3 TO Ant 1.10.4
=====================================

Changes that could break older environments:
-------------------------------------------

 * <unzip>, <unjar> and <untar> will no longer extract entries whose
   names would make the created files be placed outside of the
   destination directory anymore by default. A new attribute
   allowFilesToEscapeDest can be used to override the behavior.
   Another special case is when stripAbsolutePathSpec is false (which
   no longer is the default) and the entry's name starts with a
   (back)slash and allowFilesToEscapeDest hasn't been specified
   explicitly, in this case the file may be created outside of the
   dest directory as well.
   In addition stripAbsolutePathSpec is now true by default.
   Based on a recommendation by the Snyk Security Research Team.

Fixed bugs:
-----------

 * Delay the class initialization of the test classes until they are
   passed to JUnit. This way we can avoid that failing static initializers
   from non-test classes are reported as error when the 'skipNonTests' option
   is 'true'.
   Bugzilla Report 60062

 * The junit task when used with includeantruntime="no" was incorrectly
   printing a warning about multiple versions of ant detected in path

 * <cab> died with a NullPointerException since Ant 1.10.2.
   Bugzilla Report 62335

 * The <depend> task would fail with
   "java.lang.ClassFormatError: Invalid Constant Pool entry Type 19" while
   parsing a module-info.class. The task is compatible with
   Java bytecode version 53 now.
   Bug reported by Simon IJskes https://issues.apache.org/jira/browse/NETBEANS-781

 * Default and SecureInputHandler will now raise an error when then
   end of the input stream (usually System.in or System.console) are
   reached before a valid input has been read.

 * junitreport does not list testsuites that fail to start any tests
   because of an exception inside the all-tests and alltests-errors frames.
   Bugzilla Report 62443

Other changes:
--------------

 * AntAssert is deprecated, assertThat from JUnit 4.4+, Hamcrest matchers and/or
   ExpectedException rule provide equivalent functionality

 * PumpStreamHandler now explicitly verifies the streams for output
   and error are not null and will throw an exception if they
   are. This way creating a PumpStreamHandler will fail early as
   opposed to some obscure errors later when closing streams or
   finishing threads might fail.
   Bugzilla Report 62148

 * <property> has a new attribute runtime which can be used to set
   properties with values taken as snapshots from the
   availableProcessors, freeMemory, maxMemory and totalMemory methods
   of the Java Runtime class.

 * linecontains filter now has a new "matchAny" attribute which when
   set to "true" allows any (instead of all) of the user-specified
   strings to be present in the line.
   Bugzilla Report 62313

 * <resourcelist> has a new basedir attribute that can be used to
   resolve relative names and provides a root for the FileResources
   generated.
   Bugzilla Report 62379

 * The <includesfile> and <excludesfile> nested elements of
   <patternset> and <fileset> now support an encoding attribute that
   can be used to specify the file's encoding.
   Bugzilla Report 62379

 * New file selectors, posixGroup and posixPermissions, are available.
   The new selectors and related ownedBy selector have "followSymlinks"
   attribute that defaults to "true" for consistency.
   Bugzilla Report 22370

 * The junitlauncher task now has a "printSummary" attribute which when
   set to "true" will print the test execution summary to System.out.

Changes from Ant 1.10.2 TO Ant 1.10.3
=====================================

Changes that could break older environments:
-------------------------------------------

 * Previous versions of Ant's copy task would throw a BuildException
   if the "name" of the resource to copy was null. Starting
   this version, the copy task instead silently skips such resources
   and no longer throws an exception.
   ant-dev list https://www.mail-archive.com/dev@ant.apache.org/msg46634.html

 * Reverted the signature change of various clone method
   implementation in Ant's data-types introduced with 1.10.2 as they
   broke subclasses of said data-types which tried to override clone.

Fixed bugs:
-----------

 * Fixed NullPointerException in ChainedMapper
   Bugzilla Report 62086

 * Fixed NullPointerException when a mappedresource is used in pathconvert
   Bugzilla Report 62076

 * Fixed an issue where a string, when used as a resource collection, within
   tokens, would be replaced by property values
   Bugzilla Report 62147

 * Added a workaround for a bug in the jarsigner tool to <verifyjar>
   which requires the -storepass command line argument when verifying
   signatures using -strict together with a PKCS12 keystore. Unlike
   when signing the jar it will not prompt for the keystore's password
   and read it from standard input.
   This means Ant will now pass the keystore's password on the command
   line when using <verifyjar>, which poses a security risk you should
   be aware of.
   Bugzilla Report 62194

Other changes:
--------------

 * Allow Saxon to be used for junitreport XSL transformation
   Github Pull Request #57

 * when running on Java 11+ rmic will fail early if iiop or idl are
   requested. Java 11 removes support for CORBA and the switches have
   been removed from the rmic tool.

 * A new junitlauncher task which support JUnit 5 test framework.
   Bugzilla Report 61796

Changes from Ant 1.10.1 TO Ant 1.10.2
=====================================

Changes that could break older environments:
-------------------------------------------

 * updated the dependency of BCEL to 6.2.
   Bugzilla Report 61196

 * delete task previously would silently accept wildcard (*)
   value for the "file" attribute. That's no longer the case
   and an exception could get thrown by the underlying filesystem
   for such use. Usage like:

   <delete file="/foo/bar/*.something"/>

   should instead be changed to use resource collections like:

   <delete>
   	 <fileset dir="/foo/bar/" includes="*.something"/>
   </delete>

 * Commons Net 3.6 is binary-code, but not source compatible;
   see change list of Commons Net 3.0 for details

 * The Log4jListener is marked as deprecated as the required log4j library
   (in version 1.x) is not maintained any more.

 * Image task is marked as deprecated as the required JAI library is not
   maintained any more and internal APIs that JAI depended on are no longer
   available in Java 9.

Fixed bugs:
-----------

 * <genkey>'s <dname> child now skips <param>s that lack a key or
   value.
   Bugzilla Report 60767

 * bootstrapping Ant on Windows failed
   Bugzilla Report 61027

 * Fixed the issue where the SCP based tasks would try to change
   the permissions on the parent directory of a transferred file,
   instead of changing it on the transferred file itself.
   Bugzilla Reports 59648 and 43271

 * Fixed the issue where the source file being copied could end
   up being corrupted if the target of the copy happened to be
   the same source file (symlinked back to itself).
   Bugzilla Report 60644

 * Fixed the issue where symlink creation with "overwrite=false",
   on existing symlink whose target was a directory, would end
   up creating a new symlink under the target directory.
   Bugzilla Report 58683

 * Improvement to the Zip task for reduced memory usage in certain
   cases. Thanks to Glen Lewis for reporting the issue and
   suggesting the fix.
   Bugzilla Report 19516

 * Fixed an issue where the content redirected from output/error
   streams of a process, could end up being truncated.
   Bugzilla Report 58833, 58451

 * <fileset>/<zipfileset>/<tarfileset> will now throw an exception
   with a more useful error message when setFile is called twice on
   the same instance.
   Bugzilla Report 62071

Other changes:
--------------

 * Added forceCsvQuoteChar option to <csv> task. When enabled the
   values always get quoted.
   Github Pull Request #32

 * Added <encoding> attributes to various script related tasks and a
   compiled attribute to scriptdef.
   Github Pull Request #30

 * Added support for jarsigner's -tsadigestalg to <signjar>.
   Bugzilla Report 60665

 * added "regexp" attribute to <linecontainsregexp>
   Bugzilla Report 60968

 * reduced GC pressure by replacing all usage of FileInputStream and
   FileOutputStream.

 * Task can now also use attribute setters that expect a
   java.nio.file.Path argument.
   Bugzilla Report 61042

 * added a new magic property ant.tstamp.now that can be used to
   override the current time/date used by <tstamp>.
   Bugzilla Report 61079

 * added Orion support to ejbjar
   Github Pull Request #33

 * SCP task, when configured to use SFTP protocol, now preserves last
   modified timestamp on files that it uploads, if the
   preserveLastModified attribute is set to true for that task
   Bugzilla Report 58589

 * zip and the related tasks can now set the modification time of all
   entries to a fixed timestamp.
   Github Pull Request #36

 * Jsch library dependency has now been upgraded to 0.1.54. Jsch is
   the library behind the sshexec and scp Ant tasks.
   Bugzilla Report 61718

 * Added a new <javaversion> condition.

 * added "javac10+" as new supported value for javac's compiler attribute.

 * javah has been removed from Java 10. The task will now throw an
   exception if you try to use it while running Java 10 or newer.

 * Updated Maven Ant Tasks, Jakarta Regexp and JUnit 4 to the latest
   stable version (2.1.3, 1.4, and 4.12 respectively); updated
   JRuby to the latest Java 5 compatible version (1.6.8); added
   resolve target for AntUnit to facilitate updates.
   Github Pull Request #50

 * Updated Java Mail API, Jython, Rhino and Commons Net to the latest
   stable version (1.6.0, 2.7.0, 1.7.7.2 and 3.6, respectively).
   Github Pull Request #53

Changes from Ant 1.10.0 TO Ant 1.10.1
=====================================

Fixed bugs:
-----------

 * Ant 1.10.0 made Path#systemClasspath final which broke the Eclipse
   integration.
   Bugzilla Report 60582

 * the wrapper script still didn't work on Solaris 10, but worked on
   Solaris 11.
   The "fixed" script should work in most cases but will not preserve
   newlines present in command line arguments.
   Bugzilla Report 60562

Other changes:
--------------

 * new tasks <xz> and <unxz> and resource <xzresource> for XZ
   compression. Also the compression attribute of <tar>/<untar> now
   accepts "xz" as valid value.
   The tasks and type are contained in the new ant-xz.jar and require
   the library XZ for Java to be on the CLASSPATH.
   Bugzilla Report 60350

Changes from Ant 1.9.7 TO Ant 1.10.0
====================================

Changes that could break older environments:
-------------------------------------------

 * Ant 1.10.x requires Java8 or newer at compile or build time.
   The 1.9.x series wil stay compatible with Java5.

 * The <apt> task has been removed since apt itself has been removed
   with Java8.

 * <fileset>/<zipfileset>/<tarfileset> exhibited undefined
   behavior when both the dir and file attribute have been used on the
   same instance. This will now cause the build to fail.
   Bugzilla Report 59402

 * <native2ascii> will default to the builtin implementation on Java8
   as well (sun isn't available for Java9+ anyway).

 * The ant.java.version property will now hold the value "9" rather
   than "1.9" if running on Java 9.

 * <rmic> will no longer allow the -Xnew option (or xmic compiler) to
   be used when running on Java 9 since this option has been removed.
   Bugzilla Report 59906

 * <javah> will default to the "forking" implementation on Java8
   as well.

Fixed bugs:
-----------

 * setDynamicAttribute on MacroInstance now lower-cases the attribute
   name in order to allow users of the API to use the attributes names
   they have specified.
   Bugzilla Report 59339

 * <get>'s quiet attribute was broken, it didn't suppress any messages.
   Bugzilla Report 59379

 * <zip>'s check whether an archive is already up-to-date failed on
   NTFS filesystems and re-created archives more often than necessary.
   Bugzilla Report 59562

 * AntClassLoader didn't delegate to the parent loader for classes in
   the "jdk" package or one of its subpackages. This hierarchy has
   been introduced with Java 7.
   Bugzilla Report 59556

 * The ant wrapper script used on Unix-like operating systems only
   worked on OSes where sed is GNU sed.
   Bugzilla Report 59898

 * <touch>'s default pattern as well as the default patterns used by
   the <date> (resource) selectors depended on the JDK being used - or
   rather the locale provider being used and the default locale
   provider changed with Java 9.
   They are now fixed and the documentation has been updated to
   reflect the real patterns used rather than a non-formal description
   of the expected format.
   Bugzilla Report 59909

 * Clarified the documentation of <get>'s retries attribute.
   Bugzilla Report 59930

 * The ant wrapper script failed if backticks were passed on the
   command line.
   Bugzilla Report 60150, 59445

 * The report generated by <junitreport> could contain duplicate
   characters in stack traces.
   Bugzilla Report 58661

Other changes:
--------------

 * New file selectors <executable>, <symlink> and <ownedBy>.

 * New task <setpermissions> that provides the ability to set POSIX
   compatible permssions via NIO's PosixFilePermission

 * <junit> now initializes the cause of the AssertionFailedError when
   converting from AssertionError.
   Bugzilla Report 58982

 * <scp> now supports compression via the optional compressed attribute.
   Bugzilla Report 47552

 * <junit> now supports JDK9 modules
   Github Pull Request #18

 * a new implementation "builtin" has been added to <native2ascii> and
   is the default when running on JDK9+ since the tool itself has been
   removed from the JDK.
   Bugzilla Report 59855

 * added a new <native2asciifilter> filter that can perform non-ASCII
   to Unicode-escape conversions.

 * <rmic> defaults to the "forking" compiler on JDK 9+ as the
   implementation class of rmic is not exported by its containing
   module and thus not accessible to Ant without applying -XaddExports
   magic.
   Bugzilla Report 59860

 * a new implementation "forking" has been added to <javah> and is
   used as default when running on JDK9.

 * support for javac's -h switch has been added with the
   nativeheaderdir attribute.
   Bugzilla Report 59905

 * it is now possible to set features of the TraX factory used by <xslt>
   and <junitreport>.

 * it is now possible to use references to Ant types and classloaders
   built around Ant <path>s as values for TraX factory attributes.

 * AntClassLoader and its subclasses register themselves as parallel
   capable.

 * <junitreport> now enables the feature
   http://www.oracle.com/xml/jaxp/properties/enableExtensionFunctions
   when run on Java 9 so the redirect extension function can be used
   if when a SecurityManager is active.
   Bugzilla Report 60060

 * support for javac's --release switch introduced with Java9 has been
   added.
   Bugzilla Report 60172

Changes from Ant 1.9.6 TO Ant 1.9.7
===================================

Changes that could break older environments:
-------------------------------------------

 * <exec> and <apply> used to ignore the dir attribute if it was the
   same as the current working directory.  They now no longer do,
   which changes the behavior for vmlauncher="false" which would have
   used the project's basedir rather than the current working
   directory in that case.
   Bugzilla Report 58555

Fixed bugs:
-----------

 * ZipOutputStream could cause an ArrayIndexOutOfBoundsException when
   adding entries with comments.  This never happens when using Ant as
   a build tool but may affect users using Ant's zip package as a
   library.

 * <gunzip> and <bunzip2> didn't work for non-filesystem resources.

 * <jar> ignored the zip64Mode attribute when creating manifest-only
   jars.  This resulted in jar files that couldn't be read by Java5.
   Bugzilla Report 58428

 * <untar> will now detect GNU tar longname/link records even if they
   don't use the names used by GNU tar itself.  star is known to
   create archives of that kind.
   https://issues.apache.org/jira/browse/COMPRESS-324

 * <script> could fail to find javax.script on JDK9 with Jigsaw.
   Bugzilla Report 58271

 * <import> sometimes failed to normalize file names which could lead
   to files getting imported twice which in turn could lead to targets
   getting executed twice.
   Bugzilla Report 58886

 * TarInputStream now properly extraxt directory entries with a
   non-zero size.

 * <union> would drop file resources pointing to the same file but
   using different names.
   Bugzilla Report 57965

 * <replace>'s result was undefined when using the replacefilterfile
   attribute and some keys inside the properties files have been
   substrings of other keys. Keys are now sorted by descending size.
   Bugzilla Report 58997

 * Ant fails to run when arguments contain double-quote character.
   Bugzilla Report 58898

 * Ant fails to run if ANT_HOME contains a double-quote character.
   Bugzilla Report 58874

 * Definer's way to parse URLs from classloader breaks with
   recent Java 9 builds (b108).
   Bugzilla Report 59130

 * <ant> and <antcall> now preserve the ext status set by an <exit>
   task.
   Bugzilla Report 59228

Other changes:
--------------

 * <scp> now supports (filesystem-only) resource collections in
   addition to filesets.
   Bugzilla Report 50769

 * The <http> condition has a new optional attribute followRedirects.
   Bugzilla Report 58840

 * <java> now supports Java9 modules.
   https://github.com/apache/ant/pull/15

 * <javac> now supports Java9 modules.
   https://github.com/apache/ant/pull/16

 * <sshexec> and <scp> have two new attributes serverAliveInterval and
   serverAliveCountMax that can be used to keep a intermediaries from
   closing idle connections.
   Bugzilla Report 59162

Changes from Ant 1.9.5 TO Ant 1.9.6
===================================

Changes that could break older environments:
-------------------------------------------

Fixed bugs:
-----------

 * ArrayIndexOutOfBoundsException when ZIP extra fields are read and
   the entry contains an UnparseableExtraField.
   https://issues.apache.org/jira/browse/COMPRESS-317

Other changes:
--------------

* Hidden <javaconstant> resource is published now. It reads the
  value of a specified java constant.


Changes from Ant 1.9.4 TO Ant 1.9.5
===================================

Changes that could break older environments:
-------------------------------------------

 * The ReplaceTokens filter can now use token-separators longer than
   one character.  This means it can be used to replace mustache-style
   {{patterns}} and similar templates.  This is going to break code
   that invokes the setters on ReplaceTokens via the Java API as their
   parameters have been changed from char to String.  It may also
   break build files that specified multi character tokens and relied
   on Ant silently ignoring all but the first character.
   Bugzilla Report 56584

 * The changes that added <get>'s support for gzip encoding
   automatically uncompressed content that would not have been touched
   before - like when downloading .tar.gz files.  A new flag has been
   added to control the behavior and its default will make <get> work
   as it did in 1.9.3.  I.e. if you want it to work like 1.9.4
   you have to explicitly set tryGzipEncoding to true.
   Bugzilla Report 57048

Fixed bugs:
-----------

 * TarArchiveInputStream failed to read archives with empty gid/uid
   fields.
   Bugzilla Report 56641

 * TarArchiveInputStream could throw IOException when reading PAX
   headers from a "slow" InputStream.

 * XMLJunitResultFormatter could throw NullPointerException if Java
   cannot determine the local hostname.
   Bugzilla Report 56593

 * URLResource#getLastModified tried to access the connection to the
   URL without making sure it was established, potentially leading to
   a NullPointerException when using FTP.
   Bugzilla Report 56873

 * Long-Name and -link or PAX-header entries in TAR archives
   always had the current time as last modfication time, creating
   archives that are different at the byte level each time an
   archive was built.

 * runant.py should now work as well when the path of the Java executable
   contains spaces.
   github pull request #1

 * <junitreport> now supports nested <classpath> and <factory> elements.
   Bugzilla Report 47002

 * complete-ant-cmd.pl now also knows about the -file option.
   Bugzilla Report 57371

 * the br-replace template inside the XSLT stylesheets used by
   <junitreport> could cause stack overflows or out-of-memory errors
   when applied to big outputs.
   Bugzilla Report 57341

 * removed spurious warning about unclosed ZipFiles when reading the
   archive failed.
   Port of https://issues.apache.org/jira/browse/COMPRESS-297

 * FileUtils.rename which is used by several tasks can throw a
   NullPointerException if the "normal" renameTo operation fails and
   an exception occurs while rename falls back to copying and deleting
   the file.
   Bugzilla Report 57533

 * complete-ant-cmd.pl would incorrectly suggest words from the build
   file description.
   Bugzilla Report 51931

 * complete-ant-cmd.pl now also completes tasks without a description.
   Bugzilla Report 57542

 * LocalPropertyStack could run into ConcurrentModificationException
   when tasks spawned new child threads that accessed the properties.
   Bugzilla Report 55074

 * TarEntry's constructor with a File and a String arg didn't
   normalize the name.

 * Between 1.8.4 and 1.9.0 TarInputStream started to parse file
   names using the platform's default encoding rather than as ASCII.
   This has been a breaking change that has never been marked as such
   (in fact it went unnoticed).  In order to allow <untar> and
   <tarfileset> to work on platforms who's encoding doesn't match the
   encoding of file names inside the archive, both now support
   encoding attributes.
   The attribute has also been added to <tar> for symmetry.
   Bugzilla Report 57822

Other changes:
--------------

 * it is now possible to provide proxy configuration to signjar
   when using the timestamped authority.
   Bugzilla Report 56678

 * complete-ant-cmd.pl now also analyzes the ANT_ARGS environment
   variable.
   Bugzilla Report 57371

 * ported some of the write-optimization of Commons Compress 1.10 to
   the ZIP package

 * adapted unit tests to Java9 and added "javac1.9" as valid option
   for javac's compiler attribute.

 * performance improvements for <intersect>
   Bugzilla Report 57588

 * MailLogger can now add CC and BCC addresses.
   Bugzilla Report 57789.

 * <scp>'s buffer size has been increased from 1k to 100k to match
   <ftp> and <get>.
   github pull requests #8 and #9

 * The tar package can now deal with group and user ids bigger than
   0x80000000.
   https://issues.apache.org/jira/browse/COMPRESS-314
   https://issues.apache.org/jira/browse/COMPRESS-315

 * <scp> has new attributes fileMode and dirMode that control the
   permissions on the remote side when sending data via SSH.
   Bugzilla Report 43271.

 * New <allbutlast> and <allbutfirst> resource collections can be used
   to select all but a given subset of a resource collection.
   Bugzilla Report 57834.

Changes from Ant 1.9.3 TO Ant 1.9.4
===================================

Changes that could break older environments:
-------------------------------------------

 * the prefixValues attribute of <property> didn't work as expected
   when set to false (the default).
   It is quite likely existing build files relied on the wrong
   behavior and expect Ant to resolve the value side against the
   properties defined in the property file itself - these build files
   must now explicitly set the prefixValues attribute to true.
   Bugzilla Report 54769

 * when matching an entry of a zip/tarfileset against a pattern a
   leading slash will be stripped from the entry name.  Most archives
   don't contain paths with leading slashes anyway.
   This may cause include/exclude patterns that start with a / to stop
   matching anything.  Such patterns only used to work by accident and
   only on platforms with multiple file system roots.
   Bugzilla Report 53949

 * DirectoryScanner and thus fileset/dirset will now silently drop all
   filesystem objects that are neither files nor directories according
   to java.io.File.  This prevents Ant from reading named pipes which
   might lead to blocking or other undefined behavior.
   Bugzilla Report 56149

 * BuildFileTest and BaseSelectorTest have both been deprecated in
   favour of BuildFileRule and BaseSelectorRule respectively, and the
   tests that previously extended these base tests have been converted to
   JUnit 4 tests using the new "rule"s. Any external test that sub-classed
   a test in the Ant workspace, rather than BuildFileTest, will need
   changed to either use JUnit4's annotations, or be modified to
   extend BuildFileTest directly. This will not affect any tests that are
   being executed by Ant's junit or batchtest tasks that are not specifically
   testing Ant's code.

Fixed bugs:
-----------

 * <import>/<include> failed when the importing file was loaded from an
   URI or a jar and it imported a file from the local file system via
   an absolute path.
   Bugzilla Report 50953

 * <import> could import the same resource twice when imported via
   different resource types.
   Bugzilla Report 55097

 * several calls to File#mkdirs could fall victim to a race condition
   where another thread already created the same directory.
   Bugzilla Report 55290

 * <manifestclasspath> created '/' rather than './' for the parent
   directory of the given jarfile.
   Bugzilla Report 55049

 * <concat>'s fixlastline="true" didn't work when using certain filter
   readers.
   Bugzilla Report 54672

 * several places where resources are read from jars will now
   explicitly disable caching to avoid problems with reloading jars.
   Bugzilla Report 54473

 * AntClassloader will now ignore files that are part of the classpath
   but not zip files when scanning for resources.  It used to throw an
   exception.
   Bugzilla Report 53964

 * <javadoc> caused a NullPointerException when no destdir was set.
   Bugzilla Report 55949

 * <jar filesetmanifest="mergewithoutmain"> would still include the
   Main section of the fileset manifests if there was no nested
   manifest or manifest attribute.
   Bugzilla Report 54171

 * reading of compiler args has become more defensive
   Bugzilla Report 53754

 * <copy> without force="true" would not only fail to overwrite a
   read-only file as expected but also remove the existing file.
   Bugzilla Report 53095

 * <delete removeNotFollowedSymlinks="true"> would remove symbolic
   links to not-included files.  It will still delete symlinks to
   directories that would have been followed even if they are not
   explicitly included.  exclude-Patterns can still be used to
   preserve symbolic links.
   Bugzilla Report 53959

 * Sometimes copy-operations using NIO FileChannels fail.  Ant will
   now try to use a Stream based copy operation as fallback when the
   Channel based copy fails.
   Bugzilla Reports 53102 and 54397

 * Javadoc.postProcessGeneratedJavadocs() fails for Classes that
   extend Javadoc
   Bugzilla Report 56047

 * TarInputStream will now read archives created by tar
   implementations that encode big numbers by not adding a trailing
   NUL.

 * the isExists() method of URLResource returned false positives for
   HTTP and FTP URLs.

Other changes:
--------------

 * initial support for Java 1.9

 * <sshexec> can optionally pass System.in to the remote process
   Bugzilla Report 55393

 * <sshexec> now supports capturing error output of the executed
   process and setting a property from the return code.
   Bugzilla Report 48478

 * <javadoc> now has an option to fail if javadoc issues warnings.
   Bugzilla Report 55015

 * <sql> has a new outputencoding attribute.
   Bugzilla Report 39541

 * changes to JUnitTestRunner and PlainJUnitResultFormatter to make
   OutOfMemoryErrors less likely.
   Bugzilla Report 45536

 * changes to DOMElementWriter to make OutOfMemoryErrors less likely.
   Bugzilla Report 54147

 * <redirector> has a new attribute binaryOutput that prevents Ant
   from splitting the output into lines.  This prevents binary output
   from being corrupted but may lead to error and normal output being
   mixed up.
   Bugzilla Report 55667
   Bugzilla Report 56156

 * the nested <message> elements of <mail> now have an optional
   inputEncoding attribute that can be used to specify the encoding of
   files read that don't use the platform's default encoding.
   Bugzilla Report 56258

 * The <get> task now explicitly accepts and supports the gzip content encoding.
   Bugzilla Report 49453

 * A new resourcecollection type <multirootfileset> acts like a union
   of <fileset>s and <dirset>s that share the same configuration but
   have different base directories.
   Bugzilla Report 48621

 * <get> has a quiet attribute that makes the task log errors only
   when enabled.
   GitHub Pull Request #1

* <junit> has now a threads attribute allowing to run the tests in several threads.
  Bugzilla Report 55925

* addition of a new ProcessUtil class providing the process id of the current process

* changes to allow to run the JUnit testcases of Ant in parallel,
  by making them use unique temporary directories

Changes from Ant 1.9.2 TO Ant 1.9.3
===================================

Fixed bugs:
-----------

 * <parallel> swallowed the status code of nested <fail> tasks.
   Bugzilla Report 55539.

 * a race condition could make <fixcrlf> tasks of parallel builds to
   interfere with each other.
   Bugzilla Report 54393.

 * <mail>'s mailport still didn't work properly when using smtps.
   Bugzilla Report 49267.

 * using attributes belonging to the if and unless namespaces
   made macrodef fail.
   Bugzilla Report 55885.

 * Ant 1.8 exec task changes have slowed exec to a crawl
   Bugzilla Report 54128.

 * Apt is not available under JDK 1.8
   Bugzilla Report 55922.


Other changes:
--------------

 * Documentation fix for if/unless attributes.  PR 55359.

 * tar entries with long link names are now handled the same way as
   entries with long names.

 * Addition of 'skipNonTests' attribute to <junit> and <batchtest>
   tasks to allow the tasks to skip classes that don't contain tests.

 * <filterset> now supports a nested <propertyset> to specify filters.
   Bugzilla Report 55794.

 * <xslt>'s params can now be typed.
   Bugzilla Report 21525.

 * build of Mac OS X pkg installer
   Bugzilla Report 55899.

Changes from Ant 1.9.1 TO Ant 1.9.2
===================================

Fixed bugs:
-----------

 * Parsing of zip64 extra fields has become more lenient in order to
   be able to read archives created by DotNetZip and maybe other
   archivers as well.

 * TarInputStream should now properly read GNU longlink entries' names.
   Bugzilla Report 55040.

 * <java> and <exec> used to be too restrictive when evaluating
   whether a given set of options is compatible with spawning the new
   process.
   Bugzilla Report 55112.

Other changes:
--------------

 * <javadoc> will now post-process the generated in order to mitigate
   the frame injection attack possible in javadocs generated by Oracle
   JDKs prior to Java7 Update 25.  The vulnerability is known as
   CVE-2013-1571.
   There is an option to turn off the post-processing but it is only
   recommended you do so if all your builds use a JDK that's not
   vulnerable.
   Bugzilla Report 55132.

Changes from Ant 1.9.0 TO Ant 1.9.1
===================================

Changes that could break older environments:
-------------------------------------------

 * Users who have their own ProjectHelper implementation will need to change it because the import and include tasks
   will now default the targetPrefix to ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX.
   Users using the default ProjectHelper2 with ant need not worry about this change done to fix Bugzilla Report 54940.


Fixed bugs:
-----------

 * Corrected XSLTC error in <junitreport>.
   Bugzilla Report 54641.

 * Provide more control over Zip64 extensions created by <zip> and
   related tasks.  In particular no Zip64 extensions will be used at
   all by the <jar> task family by default - this is required for jars
   to be readably by Java5.
   Bugzilla Report 54762.

 * Fixed loading of external dependencies in JUnit task.
   Bugzilla Report 54835.

 * Target rewriting for nested "include" only works when "as" is specified.
   See also "Changes that could break older environments"
   Bugzilla Report 54940.


Other changes:
--------------

 * strict attribute added to <signjar>.
   Bugzilla Report 54889.

 * simplifying Execute.getEnvironmentVariables since we are only running on Java 1.5 or higher now

 * Added conditional attributes.
   Bugzilla Report 43362

 * Recommending to upgrade jsch to 0.1.50, particularly if you are using Java 1.7.
   jsch is the library behind the sshexec and scp Ant tasks.
   Versions of jsch older than 0.1.50 fail randomly under Java 1.7 with an error message "verify: false"

Changes from Ant 1.8.4 TO Ant 1.9.0
===================================

Changes that could break older environments:
-------------------------------------------

 * Ant now requires at least Java 1.5 to compile and to run

 * FixCRLF used to treat the EOL value ASIS to convert to the system property
   line.separator. Specified was that ASIS would leave the EOL characters alone,
   the task now really leaves the EOL characters alone. This also implies that
   EOL ASIS will not insert a newline even if fixlast is set to true.
   Bugzilla report 53036

 * The CommandLauncher hierarchy that used to be a set of inner
   classes of Execute has been extracted to the
   org.apache.tools.ant.taskdefs.launcher package.

 * Any FileResource whose represented File has a parent also has a basedir.

 * Removing the Perforce Ant tasks replaced by tasks supplied by Perforce Inc.

 * Setting the default encoding of StringResource to UTF-8 instead of null

 * Upgrade JUnit 4 to JUnit 4.11

Fixed bugs:
-----------

 * Made VectorSet faster.
   Bugzilla Report 53622.

 * Incorrect URLs in Ant child POMs.
   Bugzilla Report 53617.

 * Subclasses of JUnitTask did not correctly find junit.jar.
   Bugzilla Report 53571.

 * External XML catalog resolver failed to use project basedir when given an
   unmentioned relative path like the internal resolver does.
   Bugzilla Report 52754.

 * Fixed some potential stream leaks.
   Bugzilla Reports 52738, 52740, 52742, 52743.

 * Updated documentation to fix spelling errors / broken links.
   Bugzilla Reports 53215, 53291, 53202

 * Unable to override system properties. It was not possible not to override
   system properties from the command line (or from a property file).
   Bugzilla Report 51792

 * <javac> by default fails when run on JDK 8.
   Bugzilla Report 53347.

 * ExtensionPoint doesn't work with nested import/include
   Bugzilla Report 53405.

 * <packagemapper> failed to strip the non-matched parts with
   handledirsep="true".
   Bugzilla Report 53399.

 * <expandproperties> filter caused a NullPointerException when input
   was empty.
   Bugzilla Report 53626.

 * <get> now supports HTTP redirects using status code 307.
   Bugzilla Report 54374.

 * ssh tasks prompt for kerberos username/password under Java 7
   Bugzilla Report 53437.

 * Zip task on <mappedresources> that excludes certain files by way of the mapper resulted in a NullPointerException
   Bugzilla Report 54026

 * The ant launcher script should properly detect JAVA_HOME on
   MacOS X 10.7
   Bugzilla Report 52632

 * Depend task does not handle invokeDynamic constant pool entries - java.lang.ClassFormatError: Invalid Constant Pool entry Type 18
   Bugzilla Report 54090

 * Base64Converter not properly handling bytes with MSB set (not masking byte to int conversion)
   Bugzilla Report 54460

 * The size resource comparator would return wrong results if file
   sizes differed by more than 2 GB.
   Bugzilla Report 54623

 * Unable to encode properly into UTF-8 when the system property file.encoding is
   set to ANSI_X3.4-1968.
   Bugzilla Report 54606

 * JUnit4 tests marked @Ignore do not appear in XML output
   Bugzilla Report 43969

Other changes:
--------------

 * merged the ZIP package from Commons Compress, it can now read
   archives using Zip64 extensions (files and archives bigger that 4GB
   and with more that 64k entries).

 * a new task <commandlauncher> can be used to configure the
   CommandLauncher used by Ant when forking external programs or new
   Java VMs.
   Bugzilla Report 52706.

 * merged the TAR package from Commons Compress, it can now read
   archives using POSIX extension headers and STAR extensions.

 * merged the BZIP2 package from Commons Compress, it can now
   optionally read files that contain multiple streams properly.

 * <bunzip2> will now properly expand files created by pbzip2 and
   similar tools that create files with multiple bzip2 streams.

 * <tar> now supports a new "posix" option for longfile-mode which
   will make it create PAX extension headers for long file names.  PAX
   extension headers are supported by all modern implementations of
   tar including GNU tar.
   This option should now be used in preference to "warn" or "gnu" as
   it is more portable.  For backwards compatibility reasons "warn"
   will still create "gnu" extensions rather than "posix" extensions.

 * The ProjectHelper class now exposes a method to be used by third party
   implementations to properly resolve the binding between target extensions
   and extension points.
   Bugzilla Report 53549.

 * Make extension point bindable to imported prefixed targets
   Bugzilla Report 53550.

 * Add the possibility to register a custom command line argument processor.
   See org.apache.tools.ant.ArgumentProcessor and manual/argumentprocessor.html

 * add the possibility to suppress stdout in the sshexec task.
   Bugzilla Report 50270.

 * add an encoding attribute to the contains selector.
   This will be useful to use the contains selector if the encoding of the VM is different from the encoding
   of the files being selected.

 * support for GNU Classpath.
   Bugzilla report 54760.

Changes from Ant 1.8.3 TO Ant 1.8.4
===================================

Fixed bugs:
-----------

 * Ported libbzip2's fallback sort algorithm to CBZip2OutputStream to
   speed up compression in certain edge cases.  Merge from Commons
   Compress.

   Using specially crafted inputs this can be used as a denial of
   service attack.
   See http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2098

Changes from Ant 1.8.2 TO Ant 1.8.3
===================================

Changes that could break older environments:
-------------------------------------------

 * The Enumeration returned by AntClassLoader#getResources used to
   return null in nextElement after hasNextElement would return false.
   It has been changed to throw a NoSuchElementException instead so
   that it now adheres to the contract of java.util.Enumeration.
   Bugzilla Report 51579.

Fixed bugs:
-----------

 * Removed buggy duplicate JAR list in RPM mode.
   Bugzilla Report 52556.

 * Launcher fixed to pass the right class loader parent.
   Bugzilla Report 48633.

 * <junitreport> mishandled ${line.separator}.
   Bugzilla Report 51049.

 * <junitreport> did not work in embedded environments on JDK 7.
   Nor did <xslt> when using Xalan redirects.
   Bugzilla Report 51668, 52382.

 * Encoding of unicode escape sequences by the property file task
   Bugzilla Report 50515.

 * The code that implicitly sets the -source switch if only -target
   has been specified in <javac> was broken for Java 5 and 6.
   Bugzilla Report 50578.

 * MailLogger ignore the Maillogger.starttls.enable property.
   Bugzilla Report 50668.

 * Delete task example does not work
   Bugzilla Report 50816.

 * <splash>'s proxy handling has been delegated to <setproxy>
   internally so the two tasks are consistent.  <splash>'s way of not
   setting a proxy caused problems with other Java libraries.
   Bugzilla Report 50888.

 * Include task breaks dependencies or extension-points for multiple
   files.
   Bugzilla Report 50866.

 * Read on System.in hangs for forked java task.
   Bugzilla Report 50960.

 * FileResource specified using basedir/name attributes was non-functional.

 * Resource collection implementation of mapped PropertySet returned
   unusable resources.

 * The hasmethod condition failed with a NullPointerException when
   ignoresystemclasses is true and Ant tried to load a "restricted
   class" - i.e. a class that the Java VM will only accept when loaded
   via the bootclassloader (a java.* class).
   It will now fail with a more useful error message.
   Bugzilla Report 51035.

 * Exec task may mix the stderr and stdout output while logging it
   Bugzilla Report 50507.

 * Missing space between "finished" and timestamp in task/target
   finish message from ProfileLogger.
   Bugzilla Report 51109.

 * Redirecting the output of a java, exec or apply task could print in the
   error output stream some "Pipe broken" errors.
   Bugzilla Report 48789.

 * ZipFile failed to clean up some resources which could lead to
   OutOfMemoryException while unzipping large archives.
   A similar problem in ZipArchiveOutputStream has been fixed as well.
   Bugzilla Report 42696.

 * quiet attribute added to the copy and move tasks, to be used together
   with failonerror=false, so warnings won't get logged
   Bugzilla Report 48789.

 * System.in was closed and not readable anymore by the DefaultInputHandler
   when Ant is used via its Java API.
   Bugzilla Report 51161

 * <sync> only supported a single non-fileset resource collection even
   though the manual said it could be multiple.

 * <sync> didn't work properly when working on resource collections.
   Bugzilla Report 51462.

 * <augment> cause a NullPointerException if it was used in a target
   that was invoked by multiple targets from the command line.
   Bugzilla Report 50894.

 * The ZipFile class could read past the start of the file if the
   given file is not a ZIP archive and it is smaller than the size of
   a ZIP "end of central directory record".

 * <javac> would create the empty package-info.class file in the wrong
   directory if no destdir was specified.  Note it may still pick the
   wrong directory if you specify more than one source directory but
   no destDir.  It is highly recommended that you always explicitly
   specify the destDir attribute.
   Bugzilla Report 51947.

 * packagemapper now honors the handleDirSep attribute.
   Bugzilla Report 51086.

 * the attributes of macrodef tasks had their values run through
   property expansion twice. Still true by default, but can be disabled.
   Bugzilla Report 42046.

 * jvc doesn't like it if source file names in argument files are
   quoted.
   Bugzilla Report 31667.

 * ZipFile didn't work properly for archives using unicode extra
   fields rather than UTF-8 filenames and the EFS-Flag.

 * Access to DirectoryScanner's default excludes wasn't synchronized.
   Bugzilla Report 52188.

 * When a Project instance was created by a custom tasks its
   createTask method didn't work.
   Bugzilla Report 50788.

Other changes:
--------------

 * -f/-file/-buildfile accepts a directory containing build.xml.

 * The <javacc>, <jjtree> and <jjdoc> now support a new maxmemory
   attribute.
   Bugzilla Report 50513.

 * the documented inputstring attribute of sshexec has been
   implemented and the actually existing attribute inputproperty
   documented.
   Bugzilla Report 50576.

 * The concat task now permits the name of its exposed resource
   by means of its 'resourcename' attribute.

 * The expandproperties filter now accepts a nested propertyset
   which, if specified, provides the properties for expansion.
   Bugzilla Report 51044.

 * <junit filtertrace="true"/> will no longer filter out the very
   first line of the stacktrace containing the original exception
   message even if it matches one of the filter expressions.

 * Upgraded to Apache AntUnit 1.2

 * Provide read access to Mkdir.dir.  Bugzilla Report 51684.

 * <delete> and <move> have a new attribute performGCOnFailedDelete
   that may - when set to true - help resolve some problems with
   deleting empty directories on NFS shares.
   Bugzilla Report 45786.

 * <loadfile> and <loadresource> used to log at level INFO to signal a
   property hasn't been set when the resource was empty even if the
   quiet attribute was set to true.  They will now use VERBOSE
   instead.
   Bugzilla Report 52107.

 * <javac> has a new attribute createMissingPackageInfoClass that can
   be set to false to prevent Ant from creating empty dummy classes
   used for up-to-date-ness checks.
   Bugzilla Report 52096.

 * URLResources#isExists has become less noisy.
   Bugzilla Report 51829.

 * The <retry> task has a new optional attribute retryDelay that can
   be used to make the task sleep between retry attempts.
   Bugzilla Report 52076.

 * <signjar> has new attributes that control the signature and digest
   algorithms.
   Bugzilla Report 52344.

 * Initial support for Java 8.

 * <sshexec> can optionally create a pseudo terminal (like ssh -t)
   Bugzilla Report 52554.

Changes from Ant 1.8.1 TO Ant 1.8.2
===================================

Changes that could break older environments:
-------------------------------------------

 * Prior to Ant 1.8.0 the <copy> task and several other tasks would
   overwrite read-only destination files.  Starting with 1.8.0 they
   would only do so under special circumstances.  Ant 1.8.2 now
   consistently won't replace a read-only file by default. The same is
   true for a number of other tasks.
   The <copy>, <move> and <echo> tasks now have a new force attribute
   and <concat> has a new forceReadonly attribute that can be used to
   make the task overwrite read-only destinations.
   Bugzilla Report 49261.

 * Removed ant-nodeps.jar; it is now merged into ant.jar.

 * DOMElementWriter#encode used to employ special code before encoding
   ampersands so that &#123; remained &#123; rather than being turned
   into &amp;#123;.  This is no longer the case, ampersands will now
   be encoded unconditionally.
   Also DOMElementWriter#encodeData will treat CDATA sections containing a
   literal "]]>" sequence different now - it will split the CDATA
   section between the second "]" and ">" and create two sections.
   This affects <echoxml> task as well as the XML logger or JUnit
   formatter where ampersands will now always get encoded.
   In addition DOMElementWriter will now replace the characters \t, \r
   and \n in attribute values by entity references.
   Bugzilla Report 49404.

 * The list elements returned by ProjectHelper#getExtensionStack are
   now String arrays of length 3 rather than 2 in order to support the
   onMissingExtensionPoint attribute.
   Bugzilla Report 49473.

 * When using <property file="..." prefix="..."/> properties defined
   inside the same file will only get used in expansions if the ${}
   reference uses the same prefix.  This is different from Ant 1.8.1
   but is the same behavior Ant 1.8.0 and earlier exhibited.
   A new attribute prefixValues can be used to re-enable the behavior
   of Ant 1.8.1.
   Bugzilla Report 49373.

 * The files and directories used by Git, Mercurial and Bazaar to
   store their information are now excluded by the defaultexcludes.
   Bugzilla Report 49624.

 * The <junit> task no longer generates TestListener events - which
   have been introduced in ant 1.7.0 - by default.  The task has a new
   attribute enableTestListenerEvents and a new "magic" property
   ant.junit.enabletestlistenerevents has been added that can be used
   to reinstate the old behavior.

Fixed bugs:
-----------

 * hostinfo now prefers addresses with a hostname over addresses without
   a hostname, provided the addresses have the same scope.
   For local lookup, no IP address will be put in NAME / DOMAIN anymore.
   For remote lookup, if a host name was provided and only an IP address is
   found, the IP address will no longer overwrite the host name provided to the
   task.
   Bugzilla Report 49513

 * mmap-based file copy problems under JDK 1.4 on Linux.
   Bugzilla Report 49430.

 * The Sun JVM tries to mmap the entire file during a copy.
   For large files this is not feasible.
   We now explicitly request to copy at most 16 MiB per request.
   Bugzilla Report 49326.

 * DemuxInputStream.read() should return unsigned values
   Bugzilla Report 49279.

 * The MIME mailer ignored the port parameter when using SSL.
   Bugzilla Report 49267.

 * <xslt> ignored the classpath when using the default TraX processor.
   Bugzilla Report 49271.

 * <checksum>'s totalproperty only worked reliably if the same file
   name didn't occur inside more than one directory.
   Bugzilla Report 36748.

 * <ftp> could fail to download files from remote subdirectories under
   certain circumstances.
   Bugzilla Report 49296.

 * <junit> will now produce better diagnostics when it fails to delete
   a temporary file.
   Bugzilla Report 49419.

 * Ant would often scan directories even though there were known to
   only hold excluded files when evaluating filesets.  This never
   resulted in wrong results but degraded performance of the scan
   itself.
   Bugzilla Report 49420.

 * <javac> failed for long command lines on OS/2.
   Bugzilla Report 49425.

 * <junitreport> did not handle encodings well for stdout/stderr.
   Bugzilla Report 49418.

 * <junit> could issue a warning about multiple versions of Ant on the
   CLASSPATH if two CLASSPATH entries differed in case on a
   case-insensitive file system.
   Bugzilla Report 49041.

 * The <restrict> resource collection was checking every resource even if
   we actually just want the first one, like in the example of use of
   resourcelist in the documentation (getting the first available resource
   from a mirror list).

 * A race condition could lead to build failures if multiple <mkdir>
   tasks were trying to create the same directory.
   Bugzilla Report 49572.

 * the toString() method of the Resources class - and thus any
   ${toString:} expansion of a reference to a <resources> element -
   didn't iterate over its nested elements if it hadn't done so prior
   to the toString invocation already.
   Bugzilla Report 49588.

 * <apply> in parallel mode didn't work together with a nested
   <redirector> if maxparallel was <= 0 (the default) or no source
   files matched.
   Bugzilla Report 49594.

 * <jar filesetmanifest="merge"> didn't work for manifests added via
   <zipfileset>s that used the prefix or fullpath attributes.
   Bugzilla Report 49605.

 * <tempfile createfile="true"> would cause an error unless the prefix
   attribute has been specified.
   Bugzilla Report 49755.

 * If forked, after finished <java> was still reading the input stream
   for a bunch of characters, then stealing them from a following <input>.
   Bugzilla Report 49119.

 * Ant could be leaking threads for each forked process (started by
   <exec>, <apply>, <java> or similar tasks) that didn't receive input
   from a resource or string explicitly.
   Bugzilla Report 49587.

 * Project#setDefault threw an exception when null was passed in as
   argument, even though the Javadoc says null is a valid value.
   Bugzilla Report 49803.

 * runant.py would swallow the first argument if CLASSPATH wasn't set.
   Bugzilla Report 49963.

 * <taskdef> failed to load resources from jar files contained in a
   directory that has a "!" in its name.
   Bugzilla Report 50007.

 * ant.bat exit strategy improvements and issues
   make the exit codes work in environments where 4NT or MKS are installed
   Bugzilla Report 41039.

 * <signjar> would fail if used via its Java API and the File passed
   into the setJar method was not "normalized" (i.e. contained ".."
   segments).
   Bugzilla Report 50081.

 * <delete> ignored <fileset>'s errorOnMissingDir attribute
   Bugzilla Report 50124.

 * <symlink> failed to close files when reading a list of symbolic
   links from a properties file.
   Bugzilla Report 50136.

 * <parallel> could allow tasks to start executing even if a task
   scheduled to run before them timed out.
   Bugzilla Report 49527.

 * If a <junit> batch with multiple tests times out Ant logs a message
   about a test named Batch-With-Multiple-Tests since 1.8.0 but the
   logic that determined the Java package of this pseudo-test has been
   wrong.
   Bugzilla Report 45227.

 * <propertyfile> didn't preserve the original linefeed style when
   updating a file.
   Bugzilla Report 50049.

 * <zip>'s whenEmpty behavior never consulted the non-fileset
   resources so the task could fail even though resources have been
   provided using non-fileset resource collections.
   Bugzilla Issue 50115.

*  ftp chmod could throw a NPE.
   Bugzilla report 50217.

*  The project help (-p option in the command line) will now print
   the dependencies of the targets in debug mode (-d on the command
   line)

Other changes:
--------------

 * <concat>'s force attribute has been deprecated in favor of a new
   overwrite attribute that is consistent with <copy>'s attribute
   names.

 * You can now specify a list of methods to run in a JUnit test case.
   Bugzilla Report 34748.

 * properties in files read because of the -propertyfile command line
   option will now get resolved against other properties that are
   defined before the project starts executing (those from the same or
   earlier -propertfiles or defined via the -D option).
   Bugzilla Report 18732.

 * <pathelement>s can now contain wildcards in order to use wildcard
   CLASSPATH entries introduced with Java6.
   The wildcards are not expanded or even evaluated by Ant and will be
   used literally.  The resulting path may be unusable as a CLASSPATH
   for Java versions prior to Java6 and likely doesn't mean anything
   when used in any other way than a CLASSPATH for a forked Java VM.
   Bugzilla Report 46842.

 * A new attribute allows targets to deal with nonexistent extension
   points, i.e. they can extend an extension-point if it has been
   defined or silently work as plain targets if it hasn't.  This is
   useful for targets that get included/imported in different
   scenarios where a given extension-point may or may not exist.
   Bugzilla Report 49473.

 * Ant now logs a warning message if it fails to change the file
   modification time in for example when using <touch> or preserving
   timestamps in various tasks.
   Bugzilla Report 49485.

 * ProjectHelpers can now be installed dynamically via the <projecthelper>
   Ant task.

 * <import> is now able to switch to the proper ProjectHelper to parse
   the imported resource. This means that several kinds of different build
   files can import each other.

 * <copy tofile=""> now also works for non-filesystem resources.
   Bugzilla Report 49756.

 * The <linecontainsregexp> filter now supports a casesensitive
   attribute.

 * The <containsregexp> selector now supports casesensitive, multiline
   and singleline attributes.
   Bugzilla Report 49764.

 * A new <cutdirsmapper> can be used like wget's --cut-dirs option to
   strip leading directories from file names.

 * <javah> now supports the GNU project's gcjh compiler.
   Bugzilla Report 50149.

 * <checksum> supports additional views of a file's path as elements
   for a custom pattern.
   Bugzilla Report 50114.

 * JUnit XMLResultAggregator logs the stack trace of caught IO exceptions
   in verbose runs.
   Bugzilla Report 48836.

 * StringUtils.parseHumanSizes() should turn parse failures into
   BuildExceptions.
   Bugzilla Report 48835.

 * New task <bindtargets> to make a list of targets bound to some
   specified extension point.

 * Initial support for OpenJDK7 has been added.

 * Ant now uses java.net.CookieStore rather than
   java.util.ServiceLocator to detect whether the environment is a
   Java 1.6 system.  This means releases of gcj/gij at the time of
   this release of Ant are detected as Java 1.5 and not 1.6.
   Bugzilla Report 50256.

 * It is now possible to write a compiler adapter for <javac> that
   compiles sources with extensions other than .java (but that still
   compile to .class files).
   Bugzilla Report 48829.

 * The performance of VectorSet#add(Object) has been improved which
   should also benefit any operation that scans directories in Ant.
   Bugzilla Report 50200.

Changes from Ant 1.8.0 TO Ant 1.8.1
===================================

Changes that could break older environments:
-------------------------------------------

 * ant-trax.jar is no longer produced since TrAX is included in JDK 1.4+.

 * Ant no longer ships with Apache Xerces-J or the XML APIs but relies
   on the Java runtime to provide a parser and matching API versions.

 * The stylebook ant task and the ant-stylebook.jar are removed.

Fixed bugs:
-----------

 * Tasks that iterate over task or type definitions, references or
   targets now iterate over copies instead of the live maps to avoid
   ConcurrentModificationExceptions if another thread changes the
   maps.
   Bugzilla Report 48310.

 * The filesmatch condition threw a NullPointerException when
   comparing text files and the second file contained fewer lines than
   the first one.
   Bugzilla Report 48715.

 * Regression: The <ear> task would allow multiple
   META-INF/application.xml files to be added.
   Bugzilla Report 6836.

 * VectorSet#remove(Object) would fail if the size of the vector
   equaled its capacity.

 * Regression : ant -diagnostics was returning with exit code 1
   Bugzilla Report 48782

 * Fix for exec task sometimes inserts extraneous newlines
   Bugzilla Report 48746

 * SymlinkTest#testSymbolicLinkUtilsMethods failing on MacOS
   Bugzilla Report 48785.

 * If <concat>'s first resourcecollection child is a <resources>,
   any subsequently added child resourcecollection joins the first.
   Bugzilla Report 48816.

 * <get> with an invalid URL could trigger an NPE in some JVMs.
   Bugzilla Report 48833

 * Broken Pipe issue under Ubuntu Linux
   Bugzilla Report 48789

 * Properties wrongly read from file or not update during read
   Bugzilla Report 48768

 * AntClassLoader in Ant 1.8.0 has been considerably slower than in
   1.7.1
   Bugzilla Report 48853

 * ANT_CMD_LINE_ARGS are rippling through lower level Ant usage
   Bugzilla Report 48876

 * email : IO error sending mail with plain mimetype
   Bugzilla Report 48932

 * the complete-ant-cmd.pl script failed to create a proper cache of
   target if "ant -p" failed.
   Bugzilla Report 48980

 * <rmic>'s sourcebase attribute was broken.
   Bugzilla Report 48970

 * <copy>'s failonerror didn't work as expected when copying a single
   element resource collection to a file.
   Bugzilla Report 49070

 * <get> no longer followed redirects if the redirect URL was relative
   and not an absolute URL.
   Bugzilla Report 48972

 * fixed a performance degradation in the code that expands property
   references.
   Bugzilla Reports 48961 and 49079

 * <jar filesetmanifest="merge"> was broken on Windows.
   Bugzilla Report 49090

 * <symlink> delete failed if the link attribute was a relative path
   to a link inside the current directory without a leading ".".
   Bugzilla Report 49137

 * <telnet> and <rexec> failed to find the expected strings when
   waiting for responses and thus always failed.
   Bugzilla Report 49173

Other changes:
--------------

 * Project provides new get methods that return copies instead of the
   live maps of task and type definitions, references and targets.

 * Ant is now more lenient with ZIP extra fields and will be able to
   read archives that it failed to read in earlier versions.
   Bugzilla Report 48781.

 * The <zip> family of tasks has been sped up for bigger archives.
   Bugzilla Report 48755.

 * Add removeKeepExtension option to NetRexxC task.
   Bugzilla Report 48788.

 * Add prefix attribute to loadproperties task.

 * Add resource attribute to length task.

 * PropertyResource will effectively proxy another Resource if ${name}
   evaluates to a Resource object.

 * Added forcestring attribute to equals condition to force evaluation
   of Object args as strings; previously only API-level usage of the
   equals condition allowed Object args, but Ant 1.8.x+ property
   evaluation may yield values of any type.

 * BuildFileTest.assertPropertyUnset() fails with a slightly more
   meaningful error message
   Bugzilla Report 48834

 * <junit> will now throw an exception if a test name is empty.  This
   used to manifest itself in unrelated errors like
   Bugzilla Report 43586.

 * A change that made <exec> more reliable on Windows (Bugzilla Report
   5003) strongly impacts the performance for commands that execute
   quickly, like attrib.  Basically no single execution of a command
   could take less than a second on Windows.
   A few timeouts have been tweaked to allow these commands to finish
   more quickly but still they will take longer than they did with Ant
   1.7.1.
   Bugzilla Report 48734.

 * Added SimpleBigProjectLogger, intermediate between NoBannerLogger and
   BigProjectLogger.

 * <mappedresources> supports new attributes enablemultiplemappings
   and cache.

 * Added the augment task to manipulate existing references via Ant's basic
   introspection mechanisms.

Changes from Ant 1.8.0RC1 TO Ant 1.8.0
======================================

Changes that could break older environments:
-------------------------------------------

 * the appendtolines filter has been renamed to suffixlines.

Fixed bugs:
-----------

 * stack traces were not reported at all by <junit/>
   when filtertrace="on", which is the default.

 * ant.bat can now also process the -noclasspath switch when it is
   the first switch on a command line.
   Bugzilla Report 48186.

 * <fixcrlf> now tries to delete the created temporary files earlier.
   Bugzilla Report 48506.

 * the implementation of <zip> had been changed in a way that broke
   the jarjar links task and protentially other third-party subclasses
   as well.
   Bugzilla Report 48541.

 * <scp> task didn't report build file location when a remote operation failed
   Bugzilla Report 48578.

 * <propertyfile> would add the same comment and a date line each time
   it updated an existing property file.
   Bugzilla Report 48558.

 * <sound> didn't work properly in recent Java VMs.
   Bugzilla Report 48637.

Other changes:
--------------

Changes from Ant 1.7.1 TO Ant 1.8.0RC1
======================================

Changes that could break older environments:
-------------------------------------------

 * if and unless attributes (on <target> as well as various tasks and other
   elements) have long permitted ${property} interpolation. Now, if the result
   evaluates to "true" or "false" (or "yes", "no", "on", "off"), that boolean
   value will be used; otherwise the traditional behavior of treating the value
   as a property name (defined ~ true, undefined ~ false) is used. Existing
   scripts could be broken if they perversely defined a property named "false"
   and expected if="false" to be true, or used if="true" expecting this to be
   triggered only if a property named "true" were defined.

 * Ant now requires Java 1.4 or later.

 * Improved handling of InterruptException (lets suppose someone/thing
   is trying to kill the thread when we receive an
   InterruptException), when an InterruptException is received, we do
   not wait anymore in a while loop till the end time has been
   reached.
   Bugzilla Report 42924.

 * Refactor PropertyHelper and introspection APIs to make extension
   more granular and support setting task/type attribute values to
   objects decoded by custom PropertyEvaluator delegates. Also add
   <propertyhelper> task for registering delegates and/or replacing
   the registered PropertyHelper instance.
   Bugzilla Report 42736.

 * Added a restricted form of typedef called <componentdef>. This
   allows definition of elements that can only be within tasks or
   types. This method is now used to define conditions, selectors,
   comparators and filterreaders. This means that tasks may now have
   nested conditions just by implementing the Condition interface,
   rather than extending ConditionBase. It also means that the use of
   namespaces for some of the selectors introduced in Ant 1.7.0 is no
   longer necessary.  Implementing this means that the DynamicElement
   work-around introduced in Ant 1.7.0 has been removed.
   Bugzilla Report 40511.

 * In the <touch> task when a <mapper> is used, the millis and
   datetime attributes now override the time of the source resource if
   provisioned.
   Bugzilla Report 43235.

 * Remove fall-back mechanism for references that are not resolved
   during normal runtime execution.

 * FileUtils.createTempFile now actually creates the file.
   The TempFile task still does not create the file by default, can be
   instructed to do so however using a new parameter.
   Bugzilla Report 33969.

 * A lock in Project ensured that a BuildListener's messageLogged
   method was only ever executed by a single thread at a time, while
   all other methods could be invoked by multiple threads
   simultaniously (while within <parallel>, for example).  This lock
   is no longer in place, messageLogged should be made thread-safe
   now.

 * <sql>'s onError="stop" no longer fails the build if an error
   occurs,  this is the main difference between stop and error and
   matches what the documentation implied.
   Bugzilla Report 24668.

 * Ant's configuration introspection mechanisms have been modified to prefer
   Resource and FileProvider attributes to plain java.io.File attributes;
   however the configuration-from-String behavior remains equivalent, rendering
   a FileResource.

 * CBZip2InputStream will now throw an IOException if
   passed in a null or empty InputStream to read from.
   Bugzilla Reports 32200.

 * <unzip> will now fail when trying to extract certain broken
   archives that would have been silently ignored in earlier version.
   Bugzilla Report 35000.

 * Ant's <zip> family of tasks tries to preserve the existing Unix
   permissions when updating archives or copying entries from one
   archive to another.
   Since not all archiving tools support storing Unix permissions in
   the same way that is used by Ant, sometimes the permissions read by
   Ant seem to be 0, which means nobody is allowed to do anything to
   the file or directory.
   If Ant now encounters a permission set of 0 it will assume that
   this is not the intended value and instead apply its own default
   values.  Ant used to create entries with 0 permissions itself.
   The <zip> family of tasks has a new attribute preserve0permissions
   that can be set to restore the old behavior.
   Bugzilla Report 42122.

 * If a batch containing multiple JUnit tests running inside a forked
   Java VM caused the VM to crash (or caused a timeout), the
   formatters would receive an error message for the last test in the
   batch.
   Ant will now pass in a test with the name "Batch-With-Multiple-Tests"
   instead - this is supposed to show more clearly that the last test
   may not have started at all.
   Bugzilla Report 45227.

 * If the number of minutes a build takes is bigger then 1000 Ant will
   no longer print a thousands separator in the "elapsed time"
   message.  It used to be the thousands separator of the current
   locale.
   Bugzilla Report 44659.

 * <symlink action="delete"> used to fail if the link was broken (i.e.
   pointing to a file or directory that no longer existed).  It will now
   silently try to remove the link.
   Bugzilla Report 41285.

 * <delete file="..."> used to log a warning and not delete broken
   symbolic links.  <delete dir="..."/> didn't even log a warning.
   The task will now try to delete them in both cases.
   Bugzilla Report 41285.

 * if the dir attribute of a <fileset> points to a symbolic link and
   followsymlinks is set to false, the fileset will no longer be
   scanned and always seem empty.
   Bugzilla Report 45741.

 * the .NET tasks that have been deprecated since Ant 1.7.0 have been
   removed, please use the stand-alone Antlib you can find at
   http://ant.apache.org/antlibs/dotnet/index.html
   instead.

 * the logic of closing streams connected to forked processes (read
   the input and output of <exec> and friends) has been changed to
   deal with cases where child processes of the forked processes live
   longer than their parents and keep Ant from exiting.
   It is unlikely but possible that the changed logic breaks stream
   handling on certain Java VMs.
   Bugzilla issue 5003.

 * <checksum>'s totalproperty was platform dependent because it relied
   on java.io.File#compareTo.  It has now been made platform
   independent, which means that totalPropery values obtained on
   Windows (and other systems where the sort order of File is not case
   sensitive) can be different from the values obtained with earlier
   versions of Ant.
   Bugzilla Report 36748.

 * globmapper didn't work properly if the "to" or "from" patterns
   didn't contain a "*".  In particular it implicitly added a * to the
   end of the pattern(s).  This is no longer the case.  If you relied
   on this behavior you will now need to explicitly specify the
   trailing "*".
   Bugzilla Report 46506.

 * <copy> silently ignored missing resources even with
   failOnError="true".  If your build tries to copy non-existent
   resources and you relied on this behavior you must now explicitly
   set failOnError to false.
   Bugzilla Report 47362.

 * Ant now prefers the java.runtime.version system property over
   java.vm.version for the Created-By Manifest attribute.
   Bugzilla Report 47632.

 * The <image> task now supports a nested mapper.  In order to
   implement this, the Java API of the task had to change so any
   custom subclass overriding the processFile method will need to
   adapt (by overriding the new two-arg processFile method).
   Bugzilla Report 23243.

 * A new property syntax can be used to set attributes from
   references: ${ant.ref:some-reference}

   In most cases this will yield the exact same result as
   ${toString:some-reference} - only when an attribute setter method
   accepts an object type other than string and the project's
   reference is an Object of matching type the new syntax will pass in
   that object.

   If your build file already contains properties whose name starts
   with "ant.ref:" there is a potential for collision.  If your
   property has been set, normal property expansion will take
   precedence over the new syntax.  If the property has not been set
   and a reference with the postfix of your property name exists
   (i.e. in a very unlikely event) then the new syntax would yield a
   different result (an expanded property) than Ant 1.7.1 did.

 * A ProjectHelper implementation can now provide the default build file
   name it is expecting, and can specify if they can support a specific build
   file. So Ant is now capable of supporting several ProjectHelper
   implementations, deciding on which to use depending of the input build file.

 * Mapper-aware selectors (depends, different, present) now accept typedef'd
   FileNameMappers.

Fixed bugs:
-----------

 * The default logger was failing to print complete stack traces for
   exceptions other than BuildException when inside <ant> or
   <antcall>, thus omitting often important diagnostic
   information.
   Bugzilla 43398 (continued).

 * Better handling of package-info.class.
   Bugzilla Report 43114.

 * RPM task needed an inserted space between the define and the value.
   Bugzilla Report 46659.

 * Got rid of deadlock between in, out and err in the Redirector.
   Bugzilla Report 44544.

 * Caused by AssertionError no longer filtered.
   Bugzilla Report 45631.

 * <zip> would sometimes recreate JARs unnecessarily.
   Bugzilla Report 45902.

 * <symlink> task couldn't overwrite existing symlinks that pointed to
   nonexistent files
   Bugzilla Report 38199.

 * <symlink> task couldn't overwrite files that were in the way of the symlink.
   Bugzilla Report 43426.

 * <symlink> task failonerror="false" does not stop build from failing
   when 'ln' command returns non-zero.
   Bugzilla Report 43624

 * <touch> task couldn't differentiate between "no resources
   specified" and "no resources matched."
   Bugzilla Report 43799.

 * ManifestClassPath failed when a relative path would traverse the
   file system root.
   Bugzilla Report 44499.

 * <globmapper> had an indexoutofbounds when the prefix and postfix
   overlapped.
   Bugzilla Report 44731.

 * <typedef> and <taskdef> failed to accept file names with #
   characters in them.
   Bugzilla Report 45190

 * A deadlock could occur if a BuildListener tried to access an Ant property
   within messageLogged while a different thread also accessed one.
   Bugzilla Report 45194

 * Handle null result of system getProperty() in CommandlineJava.
   Similar to Bugzilla Report 42334.

 * Length task did not process nonexistent Resources even though these might
   conceivably still carry file length information.
   Bugzilla Report 45271.

 * <javac>'s includeJavaRuntime="false" should work for gcj now.  Note
   that you may need to set includeAntRuntime to false in order to
   have full control.
   Bugzilla Report 34638.

 * <sql> would fail if the executed statement didn't return a result
   set with some JDBC driver that dissalow Statement.getResultSet to
   be called in such a situation.
   Bugzilla Report 36265

 * if the executed statement in <sql> returned a result set and an
   update count, the count would be lost.

 * if an executed statement in <sql> mixes update count and result set
   parts, some result sets wouldn't get printed.
   Bugzilla Report 32168.

 * XmlLogger could lose messages if <parallel> is used.
   Bugzilla Report 25734.

 * <scp> creates remoteToDir if it doesn't exist.
   Bugzilla Report 42781

 * CBZip2OutputStream threw an exception if it was closed prior to
   writing anything.
   Bugzilla Reports 32200, 45836

 * The IPlanetDeploymentTool didn't use the configured DTD locations.
   Bugzilla Report 31876.

 * The ant shell script printed a warning under Cygwin if JAVA_HOME
   was not set.
   Bugzilla Report 45245.

 * <filterset> sometimes incorrectly flagged infinite recursions of
   filter tokens
   Bugzilla Report 44226.

 * failures were treated as errors in forked JUnit tests when JUnit 4
   was used.
   Bugzilla Report 43892.

 * <jar> and <manifest> disallowed manifest attributes whose name
   contained the character '8'.
   Bugzilla Report 45675.

 * BigProjectLogger would set the project's basedir to the current
   working directory.
   Bugzilla Report 45607.

 * only <formatter>s that logged to a file were notified if forked VM
   crashed or a timeout occurred in <junit>.
   Bugzilla Report 37312.

 * ant -v -version would print the version information twice.
   Bugzilla Report 45695.

 * when nested into builds that have been invoked by <ant> tasks
   <subant> might set the wrong basedir on the called projects.
   Bugzilla Report 30569.

 * If the message of the failed assertion of a forked JUnit test
   contained line feeds some excess output ended up in Ant's log.
   Bugzilla Report 45411.

 * <symlink action="delete"> failed to delete a link that pointed to
   a parent directory.
   Bugzilla Report 45743.

 * <symlink action="delete"> failed if ant lacked permission to rename
   the link's target.
   Bugzilla Report 41525.

 * when checking whether a jar is signed, <signjar> ignored the
   sigfile attribute.
   Bugzilla Report 44805.

 * When using JavaMail all <mail> tasks used the same mail host
   regardless of their configuration.
   Bugzilla Report 37970.

 * <signjar> and <issigned> didn't handle aliases with characters other
   than numbers, letters, hyphen or underscore properly.
   Bugzilla Report 45820.

 * <filterset> could miss multi-character begin tokens in some cases.
   Bugzilla Report 45094.

 * <depend> didn't close JARs that were part of the classpath.
   Bugzilla Report 45955.

 * in some cases <depend> would delete class files even if it didn't
   find the corresponding source files.
   Bugzilla Report 45916.

 * <javadoc> failed if the nested <bottom> or <head> contained line
   breaks.
   Bugzilla Report 43342.

 * encoding="auto" has been broken in <mail> since Ant 1.7.0 and only
   worked if JavaMail was available.
   Bugzilla Report 42389.

 * MailLogger could cause a NullPointerException.
   Bugzilla Report 44009.

 * <junit> didn't recognize failed assertions as failures if they
   caused subclasses of AssertionError to be thrown (like
   org.junit.ComparisonFailure that is thrown when assertEquals
   fails).
   Bugzilla Report 45028.

 * the Unix "ant" wrapper script failed to protect wildcards in
   command line arguments in some cases.
   Bugzilla Report 31601.

 * <cvstagdiff> crippled file names and could miss some entries if
   multiple modules have been specified.
   Bugzilla Report 35301.

 * Tasks with a "public void add(SomeType)" method failed to work as
   TaskContainers at the same time.
   Bugzilla Report 41647.

 * Tasks that implementes DynamicElemen or DynamicElementNS failed to
   work as TaskContainers at the same time.
   Bugzilla Report 41647.

 * combining SSL and authentication in <mail> and MailLogger failed in
   some setups.
   Bugzilla Report 46063.

 * if an error occurs while logging the buildFinished event, the
   original error is now logged to System.err.
   Bugzilla Report 25086.

 * <copy> failed with a NullPointerException when copying a resource
   without a name.  It will now fail with a meaningful error message.
   Bugzilla Report 39960.

 * <xslt> now uses the configured classpath to load the factory (when
   using TraX) before falling back to Ant's own classpath.
   Bugzilla Report 46172.

 * <dependset> complained about files being modified in the future if
   they had been just very recently (within Ant's assumed granularity
   of the file system).
   Bugzilla Report 43665.

 * <sshexec> didn't store the output in outputproperty if the remote
   command failed.
   Bugzilla Report 46340.

 * DirectoryScanner's slow-scanning algorithm that is used when you
   ask for excluded or not-included files and/or directories could
   miss some files and directories in the presence of recursive
   exclude patterns.

 * <sort> resource collection kept only one of entries deemed equal by
   the chosen Comparator.
   Bugzilla Report 46527.

 * the ZipFile class used by <unzip> and others could leave the
   archive open (making it undeletable on Windows as long as the java
   VM was running) for files with an unexpected internal structure.
   Bugzilla Report 46559.

 * The zip package now supports the extra fields invented by InfoZIP
   in order to store Unicode file names and comments.

 * The zip package detects the encoding bit set by more modern
   archivers when they write UTF-8 filenames and optionally sets it
   when writing zips or jars.
   Bugzilla Report 45548

 * <sync> could run into a NullPointerException when faced with broken
   symbolic links.
   Bugzilla Report 46747.

 * The ant shell script should now support MSYS/MinGW as well.
   Bugzilla Report 46936.

 * <signjar> has a new force attribute that allows re-signing of jars
   that are already signed.
   Bugzilla Report 46891.

 * <sshexec> now again honors failonerror in the face of connection
   errors.
   Bugzilla Report 46829.

 * The <replacetokens> filter threw an exception if the stream to
   filter ended with a begin token.
   Bugzilla Report 47306.

 * <scriptmapper>, <scriptfilter> and <scriptcondition> didn't support
   the setbeans attribute.
   Bugzilla Report 47336.

 * <loadproperties>' encoding attribute didn't work.
   Bugzilla Report 47382.

 * Ant created tar archives could contain random bytes at the end
   which confused some untar implementations.
   Bugzilla Report 47421.

 * various places where unchecked PrintWriters could hide exceptions
   have been revisited to now check the error status or not use a
   PrintWriter at all.
   Bugzilla Report 43537.

 * filesetmanifest="mergewithoutmain" in <jar> didn't treat inline
   manifests as expected.
   Bugzilla Report 29731.

 * <record> didn't work properly with nested builds.
   Bugzilla Report 41368.

 * <jar> with filesetmanifest different from skip didn't work if the
   update attribute has been set to true.
   Bugzilla Report 30751.

 * The default stylesheets for <junitreport> failed to properly escape
   XML content in exception stack traces.
   Bugzilla Report 39492.

 * AntClassLoader didn't set the proper CodeSource for loaded classes.
   Bugzilla Report 20174.

 * AntClassLoader.getResourceAsStream would return streams to
   resources it didn't return with getResource and to classes it
   failed to load.
   Bugzilla Report 44103.

 * Logging exceptions without a message would cause a
   NullPointerException.
   Bugzilla Report 47623.

 * WeblogicDeploymentTool could fail on platforms with a file
   separator other than "/".
   Bugzilla Report 35649.

 * The update attribute of the modified selector was ignored.
   Bugzilla Report 32597.

 * <manifest> and <jar> can now merge Class-Path attributes from
   multiple sources and optionally flatten them into a single
   attribute.
   The default behaviour still is to keep multiple Class-Path
   attributes if they have been specified and to only include the
   attributes of the last merged manifest.
   Bugzilla Report 39655.

 * <delete> didn't work correctly with a <modified> selector because
   it was scanning the same filesets more than once.
   Bugzilla Report 43574.

 * when using custom filterreaders with the <filterreader classname="">
   syntax Ant could leak memory.
   The problem didn't occur when using <typedef> or <componentdef> to
   define the filterreader which is the recommended approach.
   Bugzilla Report 45439.

 * Ant didn't set the proper "magic" value for tar entries containing
   long file names in GNU longfile mode.
   Bugzilla Report 47653.

 * The tar task failed to recognize that the archive had to be
   (re-)created in some cases where the sources are filesystem based
   resources but not filesets.
   Bugzilla Report 48035.

 * <sshexec>'s outputproperty was prefixed by the executed command
   when the command attribute has been used, breaking backwards
   compatibility to Ant 1.7.0.
   Bugzilla Report 48040.

 * different task instances of the same <scriptdef>ed tasks could
   overwrite each others attributes/nested elements.
   Bugzilla Report 41602.

 * The Hashvalue algortihm implementation of the modified task could
   fail to read the file(s) completely.
   Bugzilla Report 48313.

Other changes:
--------------

 * The get task now also follows redirects from http to https
   Bugzilla Report 47433

 * A HostInfo task was added performing information on hosts, including info on
   the host ant is running on.
   Bugzilla Reports 45861 and 31164.

 * There is now a FileProvider interface for resources that act as a source
   of filenames. This should be used by tasks that require resources
   to provide filenames, rather than require that all resources
   are instances or subclasses of FileResource.
   Bugzilla Report 43348

 * There is now a URLProvider interface for resources that act as a
   source of URLs. This should be used by tasks that require resources
   to provide URLs, rather than require that all resources are
   instances or subclasses of URLResource.

 * Fixcrlf now gives better error messages on bad directory attributes.
   Bugzilla Report 43936

 * a new property ant.project.default-target holds the value of the
   current <project>'s default attribute.

 * a new property ant.project.invoked-targets holds a comma separated
   list of the targets that have been specified on the command line
   (the IDE, an <ant> task ...) when invoking the current project.

 * The <type> resource selector has had an "any" type added for better
   configurability.

 * Ant should detect the OS as both a Mac and a Unix system when
   running on OpenJDK.
   Bugzilla Report 44889.

 * new protected getConnection and getStatement methods allow
   subclasses of SQLExec more control - or access to the cached
   instances when overriding other methods like runStatements.
   Bugzilla Report 27178.

 * <sql> has a new failOnConnectionError attribute that can be used to
   keep a build going even if the task failed to connect to the
   database.
   Bugzilla Report 36712.

 * A new attribute strictDelimiterMatching can be used to ignore case
   or whitespace differences when <sql> searches for delimiters.
   This is useful if you execute a SQL script that has contains "GO"
   and "go" as delimiters.
   Bugzilla Report 26459.

 * A new showWarnings attribute of <sql> allows warnings to be logged.
   Bugzilla Report 41836.

 * A new treatWarningsAsErrors attribute of <sql> can be used to fail
   a build if a warning occurs.
   Bugzilla Report 41836.

 * Ant now supports scoped properties (see Local task).
   Bugzilla Report 23942.

 * <sql>'s CSV output can be controlled via the new attributes
   csvColumnSeparator and csvQuoteCharacter.
   Bugzilla Report 35627.

 * <ftp>'s logging has been improved.
   Bugzilla Reports 30932, 31743.

 * It is now possible to disable <ftp>'s remote verification.
   Bugzilla Report 35471.

 * <sshexec> now supports input in a way similar to <exec>
   Bugzilla Report 39197.

 * <scp> can now preserve the file modification time when downloading
   files.
   Bugzilla Report 33939.

 * the new task sshsession can run multiple tasks in the presence of
   an SSH session providing (local and remote) tunnels.
   Bugzilla Report 43083.

 * ZipOutputStream has been sped up for certain usage scenarios that
   are not used by Ant's family of zip tasks.
   Bugzilla Report 45396.

 * <echo> supports an "output" Resource attribute as an alternative to "file".

 * <sql> "output" attribute now supports any Resource in addition to a file.

 * <scp> no longer requires a passphrase when using key based
   authentication.
   Bugzilla Report 33718.

 * a new failOnEmptyArchive attribute on <unzip> and <untar> can now
   make the task fail the build if it tries to extract an empty
   archive.

 * <unzip> and <untar> have a new attribute stripAbsolutePathSpec.
   When set to true, Ant will remove any leading path separator from
   the archived entry's name before extracting it (making the name a
   relative file name).
   Bugzilla Report 28911.

 * <unzip> will now detect that it was asked to extract a file that is
   not an archive earlier if the file is big.
   Bugzilla Report 45463.

 * New file and resource selectors <readable/> and <writable/> have
   been added that select file which the current process can read or
   write.
   Bugzilla Report 45081.

 * The filename file selector has a new attribute regex that allows
   files to be selected by matching their names against a regular
   expression.
   Bugzilla Report 45284

 * The name resource selector has a new attribute regex that allows
   resources to be selected by matching their names against a regular
   expression.
   Bugzilla Report 45284

 * Enhanced performance of Project.fireMessageLoggedEvent and DirectoryScanner
   Bugzilla Reports 45651 and 45665

 * The package list location for offline links can now be specified as
   an URL.
   Bugzilla Report 28881

 * <echoxml> now supports XML namespaces.
   Bugzilla Report 36804.

 * A new listener for <junit> has been added that tries to invoke the
   tearDown method of a TestCase if that TestCase was run in a forked
   VM and the VM crashed or a timeout occurred.  See the <junit> task's
   manual page for details.
   Bugzilla Report 37241.

 * The Jar task now supports the addition of a jar index file in update mode.
   Previously the absence of the index was not enough to trigger the rebuild;
   some other update was necessary.
   Bugzilla report 45098.

 * <ant> has a new attribute "useNativeBasedir" that makes the child
   build use the same basedir it would have used if invoked from the
   command line.  No matter what other attributes/properties have been
   set.
   Bugzilla Report 45711.

 * <patch> has a new optional failOnError attribute.
   Bugzilla Report 44772.

 * Antlib descriptors will now be parsed by the configured
   ProjectHelper if the implementation overrides the new
   canParseAntlibDescriptor and parseAntlibDescriptor methods.  If the
   configured helper doesn't override the methods, a new instance of
   ProjectHelper2 will be used just like in Ant 1.7.1.
   Bugzilla Report 42208.

 * It is now possible to explicitly set the executable used by
   <signjar>.
   Bugzilla Report 39189.

 * <compositemapper>'s order of results is now predictable.
   Bugzilla Report 44873

 * a new <firstmatchmapper> has been added, which works similar to
   <compositemapper> but only returns the results of the first nested
   mapper that matches.
   Bugzilla Report 44873

 * <get> has a new maxtime attribute that terminates downloads that
   are taking too long.
   Bugzilla Report 45181.

 * <ftp> now supports selectors for remote directories as well.
   Bugzilla Report 44726.

 * In some cases Ant fails to rename files if the source or target
   file has just recently been closed on Windows.  It will now try to
   delete the offending file once again after giving the Java VM time
   to really close the file.
   Bugzilla Report 45960.

 * two new properties can be used to set the MIME-Type and charset
   used by MailLogger.
   Bugzilla Report 27211.

 * a new attribute of <mail> allows the task to succeed if it can
   reach at least one given recipient.
   Bugzilla Report 36446.

 * two new properties allow MailLogger to send a fixed text instead of
   the log file.
   Bugzilla Report 38029.

 * <cvsversion> is supposed to support CVSNT now.
   Bugzilla Report 31409.

 * <cvs>' port attribute should now work for all clients that use the
   environment variable CVS_PSERVER_PORT instead of the "official"
   CVS_CLIENT_PORT.
   Bugzilla Report 30124.

 * <cvsversion> now works for local repositories as well.

 * <cvstagdiff> has an option to ignore removed files now.
   Bugzilla Report 26257.

 * <cvs> and friends now support modules with spaces in their names
   via nested <module> elements.

 * A new attribute "ignoreEmpty" controls how <concat> deals when
   there are no resources to concatenate.  If it is set to false, the
   destination file will be created regardless, which reinstates the
   behavior of Ant 1.7.0.
   Bugzilla Report 46010.

 * If the new remote attribute is set to true, <cvschangelog> can now
   work against a remote repository without any working copy.
   Bugzilla Report 27419.

 * start and end tags can now be used instead of dates in
   <cvschangelog>.
   Bugzilla Report 27419.

 * MailLogger and <mail> can now optionally enable support for
   STARTTLS.
   Bugzilla Report 46063.

 * <import> has new attributes "as" and "prefixSeparator" that can be
   used to control the prefix prepended to the imported targets'
   names.

 * a new task <include> provides an alternative to <import> that
   should be preferred when you don't want to override any targets.

 * delete has a new attribute removeNotFollowedSymlink.  If set to
   true, symbolic links not followed (because followSymlinks was false
   or the number of symlinks was too big) will be removed.
   Bugzilla Report 36658.

 * the os and osfamily attributes of <chown>, <chgrp>, <chmod> and
   <attrib> can now be used to run the commands on operating systems
   other than their "native" environment, i.e. non-Unix or non-Windows
   operating systems respectively.
   Bugzilla Report 7624.

 * a new resource collection <mappedresources> generalizes the prefix
   and fullpath attributes of <zipfileset> to arbitrary mappers that
   can be applied to arbitrary resource collections.
   Bugzilla Report 4240.

 * <tarfileset> and <zipfileset> have a new attribute
   errorOnMissingArchive that allows "optional" filesets that don't
   break the build if the archive doesn't exist.
   Bugzilla Report 46091.

 * <javadoc> has new attributes that correspond to the
   -docfilessubdirs and -excludedocfilessubdir command line arguments.
   Bugzilla Report 34455.

 * <xslt> now fails early if a specified stylesheet doesn't exist.
   Bugzilla Report 34525.

 * <xslt> now has an option to suppress transformer warnings.  This
   option only has an effect for processors that support this feature;
   the "trax" processor included with Ant does support it.
   Bugzilla Report 18897.

 * <xslt> has two new attributes failOnError and
   failOnTransformationError that can be used to not make the build
   process proceed if an error occurs.
   Bugzilla Report 36260.

 * <xslt> has a new attribute failOnNoResources that can be used to
   make the build fail/continue if the collection of resources to
   transform is empty.
   Bugzilla Report 46274.

 * It is now possible to define system properties that should be set
   during xslt's transformation.  This can be used to enable XInclude
   processing in Xerces, for example.
   Bugzilla Report 36653.

 * a new resource collection <archives> can be used to specify
   collections of ZIP and TAR archives as sources.  It extracts them on
   the fly.  This is a generalization of the <zipgroupfileset> found
   as nested element of <zip> and friends.
   Bugzilla Report 46257.

 * <dependset> has a new verbose attribute that makes the task list
   all deleted targets and give a hint as to why it deleted them.
   Bugzilla Report 13681.

 * <replaceregexp> now supports arbitrary filesystem based resource
   collections.
   Bugzilla Report 46341.

 * <replace> now supports arbitrary filesystem based resource
   collections.
   Bugzilla Report 24062.

 * token and value of <replace>'s nested <replacefilter> can now also
   be specified as nested elements to allow multiline content more
   easily.
   Bugzilla Report 39568.

 * <replace> and <replaceregexp> can now optionally preserve the file
   timestamp even if the file is modified.
   Bugzilla Report 39002.

 * The <replace> child-elements <replacetoken> and <replacevalue> have
   a new attribute that controls whether properties in nested text get
   expanded.
   Bugzilla Report 11585.

 * <replace> has a new attribute failOnNoReplacements that makes the
   build fail if the task didn't do anything.
   Bugzilla Report 21064.

 * <sync>'s <preserveInTarget> has a new attribute that controls
   whether empty directories should be kept.
   Bugzilla Report 43159.

 * ant -diagnostics now checks that it can read as much from the
   temporary directory as it has written.  This may help detecting a
   full filesystem.
   Bugzilla Report 32676.

 * <pathconvert> has a new preserveduplicates attribute--historically
   these were eliminated in the interest of behaving in the manner
   of a "path."

 * <javac>'s source and target attributes are no longer ignored when
   using gcj.
   Bugzilla Issue 46617.

 * ant -diagnostics now outputs information about the default XSLT
   processor.
   Bugzilla Issue 46612.

 * the ZIP library will now ignore ZIP extra fields that don't specify
   a size.
   Bugzilla Report 42940.

 * CBZip2OutputStream now has a finish method separate from close.
   Bugzilla Report 42713.

 * the <zip> and <unzip> family of tasks has new options to deal with
   file name and comment encoding.  Please see the zip tasks'
   documentation for details.

 * <input ...><handler type="secure" /></input> now uses previously
   undocumented SecureInputHandler shipped with Ant 1.7.1.

 * Command line arguments for <exec> and similar tasks can now have
   optional prefix and suffix attributes.
   Bugzilla Report 47365

 * <apply>'s srcfile and targetfile child elements can now have
   optional prefix and suffix attributes.
   Bugzilla Report 45625

 * <jar> has a new attribute to enable indexing of META-INF
   directories which is disabled for backwards compatibility reasons.
   Bugzilla Report 47457

 * <apt>'s executable attribute can be used to specify a different
   executable.
   Bugzilla Report 46230.

 * <rmic>'s new executable attribute can be used to specify a
   different executable.
   Bugzilla Report 42132.

 * <javac>, <rmic>, <javah> and <native2ascii> now provide a nested
   element to specify a classpath that will be used when loading the
   task's (compiler) adapter class.
   Bugzilla Report 11143.

 * <javac>, <rmic>, <javah> and <native2ascii> now provide a nested
   element to specify the task's (compiler) adapter as an instance of
   a class that has been defined via typedef/componentdef.  This
   allows more control over the classpath and allows adapters to be
   defined in Antlibs easily.

 * A new subclass org.apache.tools.ant.loader.AntClassLoader5 of
   AntClassLoader has been added which overrides getResources
   which became non-final in ClassLoader with Java5+ so
   this method now behaves as expected.
   The new subclass will be used by Ant internally if it is available
   and Ant is running on Java5 or more recent.
   Bugzilla Report 46752.

 * a new attributes can chose a different request method than GET for
   the http condition.
   Bugzilla Report 30244

 * <splash> now supports a configurable display text and a regular
   expression based way to determine progress based on logged messages.
   Bugzilla Report 39957.

 * the number of retries on error in <get> is now configurable.  <get>
   can be told to not download files that already exist locally.
   Bugzilla Report 40058.

 * Ant now builds against commons-net 2.0 as well.
   Bugzilla Report 47669.

 * A new nested element connectionProperty of <sql> allows setting of
   arbitrary JDBC connection properties.
   Bugzilla Report 33452.

 * A new islastmodified condition can check the last modified date of
   resources.

 * <rmic> has a new destDir attribute that allows generated files to
   be written to a different location than the original classes.
   Bugzilla Report 20699.

 * <rmic> has a new listfiles attribute similar to the existing one of
   <javac>.
   Bugzilla Report 24359.

 * It is now possible to suppress the "FAILED" lines sent to Ant's
   logging system via <junit>'s new logFailedTests attribute.
   Bugzilla Report 35073.

 * <propertyfile> now can delete entries.

 * The <resources> resource collection can now optionally cache its
   contents.

 * A new <resourceexists> condition can check whether resources exists.

 * <sql> has two new attributes errorproperty and warningproperty that
   can be set if an error/warning occurs.
   Bugzilla Report 38807.

 * <sql> has a new attribute rowcountproperty that can be used to set
   a property to the number of rows affected by a task execution.
   Bugzilla Report 40923.

 * when Ant copies files without filtering, it will now use NIO
   channels.
   Bugzilla Report 30094.

 * <get> has a new attribute that can be used to disable caching on
   HTTP connections at the HttpUrlConnection level.
   Bugzilla Report 41891.

 * <tar> and <zip> (and tasks derived from <zip>) will now create the
   parent directory of the destination archive if it doesn't exist.
   Bugzilla Report 45377.

 * A new filterreader <sortfilter> that sorts input lines has been
   added.
   Bugzilla Report 40504.

 * A new token filter <uniqfilter> that suppresses tokens that match
   their ancestor token has been added.

 * <rootfileset>s nested into <classfileset>s can now use a dir
   attribute different from the <classfileset>.
   Bugzilla Report 37763.

 * <path> can now optionally cache its contents.

 * <property> can now specify values as nested text.
   Bugzilla Report 32917.

 * a new parentFirst attribute on <javaresource> allows resources to
   be loaded from the specified classpath rather than the system
   classloader.
   Bugzilla Report 41369.

 * <property location="from" basedir="to" relative="true"/> can now
   calculate relative paths.

 * The <name> selector supports a new handleDirSep attribute that
   makes it ignore differences between / and \ separators.
   Bugzilla Report 47858.

 * <get> now supports resource collections (as long as the resources
   contained provide URLs) and can get multiple resources in a single
   task.

 * <import> can now import non-File resources if they provide an URL
   - as the <url> and <javaresource> resources do.
   Bugzilla Report 29251

 * <import> can now import multiple resources specified as resource
   collections.
   Bugzilla Report 22269.

 * a new <resourcelist> type is similar to <filelist> but can read the
   list of resources from non-file resources and may return resources
   that are not files.

 * a new filterreader appendtolines complements prefixlines.

 * a new top level element extension-point allows build files to be
   extended with custom targets more easily.

Changes from Ant 1.7.0 TO Ant 1.7.1
=============================================

Changes that could break older environments:
-------------------------------------------

* String resources only have properties single expanded. If you relied on
  <string> resources being expanded more than once, it no longer happens.
  Bugzilla report 42277.

* A String resource's encoding attribute was only taken into account when
  set from the resource's OutputStream; the InputStream provided the String's
  binary content according to the platform's default encoding. Behavior has
  been modified to encode outgoing (InputStream) content as well as encoding
  incoming (OutputStream) content.

* <java> with fork now returns gives -1 instead of 0 as result when failonerror
  is false and some exception (including timeout) occurs. Br 42377.

* ant-type attribute has been marked as deprecated and a warning has been
  issued if it is encountered in the build file.

Fixed bugs:
-----------

* The default logger was failing to print complete stack traces for exceptions
  other than BuildException, thus omitting often important diagnostic
  information. Bugzilla 43398.

* Error in FTP task
  Bugzilla report 41724

* Regression: Locator fails with URI encoding problem when spaces in path
  Bugzilla report 42222

* Regression in Locator: running Ant off a network share does not work:
  message "URI has authority component" appears
  Bugzilla report 42275

* Improvements in AntClassLoader Speed.
  Bugzilla report 42259

* Error in handling of some permissions, most notably the AllPermission on
  jdk 1.5
  Bugzilla report 41776

* Replace task summary output incorrect.
  Bugzilla report 41544

* Dependset crashes ant when timestamp on files change during Dependset
  execution.
  Bugzilla report 41284

* Bug in org.apache.tools.ant.types.resources.comparators.Date
  Bugzilla report 41411

* <junit> in Ant 1.7.0 could throw NPE if no <classpath> was defined.
  Bugzilla report 41422.

* In Ant 1.7.0, <fileset> in <javadoc> does not by default include only
  **/*.java as the documentation claims and earlier revisions did.
  Bugzilla report 41264.

* SPI support in jar was broken.
  Bugzilla report 41201.

* jsch-0.1.30 causes SCP task to hang
  Bugzilla report 41090.

* Target from imported file listed twice in projecthelp.
  Bugzilla report 41226.

* <sql> task double-expands properties if expandproperties is true,
  and expands properties if expandproperties is false.
  Bugzilla report 41204.

* Rolling back Bugzilla 32927 (set a default description for a javadoc tag
  if not set) as it caused a BC problem.
  Bugzilla report 41268.

* <apt> forks properly and so memory settings are picked up.
  Bug report 41280.

* Regression: NPE was thrown when using <pathconvert> against a
  (third-party instantiated) fileset with null Project reference.

* Strip out all -J arguments to non forking rmic adapters, specifically
  the Sun and Weblogic compilers.
  Bug report 41349

* Synchonization issues in PropertyHelper.  Bugzilla 41353.

* <concat binary="true" append="true"> did not append.  Bugzilla 41399.

* -autoproxy turns Java1.5+ automatic proxy support on. Bugzilla 41904

* Handle null result of system getProperty(). Bugzilla 42334.

* Regression: concat fixlastline="true" should not have applied to
  nested text, but did in Ant 1.7.0. Bugzilla 42369.

* Regression: ant.version was not passed down in <ant>, <subant>.
  This worked in Ant 1.6.5, but not in 1.7.0.
  ant.core.lib (added in 1.7.0) was also not being propagated.
  Bugzilla bug 42263

* Regression: bzip2 task created corrupted output files for some inputs.
  Bugzilla bug 41596.

* Regression: <available> with <filepath> did not work.
  Bugzilla 42735.

* ant script, cd may output to stdout.
  Bugzilla 42739.

* Modified selector doesn't update the cache if only one file has changed.
  Bugzilla 42802.

* Regression: Path subclasses that overrode list() stopped working in
  resourceCollection contexts in Ant 1.7.0. Bugzilla 42967.

* <property> supports loading from xml based property definition.
  Bugzilla 42946

* <junit> supports collecting and rerunning failed test cases
  (textXXX methods). Bugzilla 42984.

* War task failed with "No WEB-INF/web.xml file was added" when called
  a second time. Bugzilla 43121.

* FilterMapper could throw an NPE.
  Bugzilla 43292.

* Regession nested macrodefs with elements could cause StackOverFlow.
  Bugzilla 43324.

* Some changes to <junit> broke third party tasks that extend it (like
  Apache Cactus' Ant task).  The changes have been modified so that
  subclases should now work again - without any changes to the
  subclass.

Other changes:
--------------

* Various small optimizations speed up common tasks such as <javac> on large
  filesets, reducing both I/O and CPU usage.

* Profiling logger has been added with basic profiling capabilities.

* <script> now has basic support for JavaFX scripts

* SSH task can now take a command parameter containing the commands to execute.
  This allows you to connect to a server and execute a number of commands
  without constantly reconnecting for each command.

* Upgraded XML API to XML commons version 1.3.04.

* Upgraded to Xerces 2.9.0

* <script> can now work with bsf.jar and js.jar in its <classpath>.

* add errorProperty and updatedProperty to <javac>
  Bugzilla 35637 and 28941.

* add classpathref attribute to <whichresource>
  Bugzilla 41158.

* reduce logging noise of <apply skipemptyfilesets="true">
  Bugzilla 29154

* Show Previous Revision in the tagdiff.xsl stylesheet
  Bugzilla 29143

* Allow <mapper refid> to refer directly to a FileNameMapper instance.

* If you try and use a type in a namespace (or an antlib), and the type is not
  recognized but there are other definitions in that namespace, Ant lists what
  the known definitions are. This helps you find spelling errors.

* Add a <last> resource collection, corresponding to <first>.

* Add new <truncate> task.

* <junitreport> xsl stylesheets allow setting the title used in <title> and <h1> tags by
  using <report><param> element.  Bugzilla 41742.

* Add IgnoreDependenciesExecutor for weird cases when the user wants to run
  only the targets explicitly specified.

* Patternset allows nested inverted patternsets using <invert>.

* <manifest> checks for validity of attribute names.

* JUnitVersionHelper.getTestCaseClassName is now public. Bugzilla 42231

* <string> resource supports nested text. Bugzilla bug 42276

* <scriptdef> now sources scripts from nested resources/resource collections. This lets you
  define scripts in JARs, remote URLs, or any other supported resource. Bugzilla report 41597.

* <concat> is now usable as a single-element ResourceCollection.

* It is now possible to provide the value of a <striplinecomments> filter's
  <comment> nested element as nested text instead of using the 'value'
  attribute.

* A new logger, BigProjectLogger, lists the project name with every target

* Default text added to macrodef. Bugzilla report 42301.

* "rawblobs" attribute added to SQL task.

* Add new retry task container.

* <jar> has a new strict attribute that checks if the jar complies with
  the jar packaging version specification.

* <javac> has a new attribute - includeDestClasses.
  Bugzilla 40776.

* <fileset> has a new attribute - errorOnMissingDir.
  Bugzilla 11270.

* <javac> handles package-info.java files, there were repeatedly compiled.
  Bugzilla 43114.

* SecureInputHandler added to use Java 6 System.console().readPassword()
  when available.

Changes from Ant 1.6.5 to Ant 1.7.0
===================================

Changes that could break older environments:
-------------------------------------------

* Initial support for JDK 6 (JSR 223) scripting.
  <*script*> tasks will now use javax.scripting if BSF is
  not available, or if explicitly requested by using
  a "manager" attribute.

* Removed launcher classes from nodeps jar.

* <classconstants> filter reader uses ISO-8859-1 encoding to read
  the java class file. Bugzilla report 33604.

* Defer reference process. Bugzilla 36955, 34458, 37688.
  This may break build files in which a reference was set in a target which was
  never executed. Historically, Ant would set the reference early on, during parse
  time, so the datatype would be defined. Now it requires the reference to have
  been in a bit of the build file which was actually executed. If you get
  an error about an undefined reference, locate the reference and move it somewhere
  where it is used, or fix the depends attribute of the target in question to
  depend on the target which defines the reference/datatype.
  As a result of testing on real live build scripts, a fall-back mechanism
  was put it place to allow references that are out-of-band to be resolved. If
  this happens a big warning message is logged. This fall-back mechanism will
  be removed in Ant 1.8.0.

* <script> and <scriptdef> now set the current thread context.

* Unrestrict the dbvendor names in the websphere element of the ejbjar task.
  Bugzilla Report 40475.

* <env> nested element in <java>, <exec> and others is now case-insensitive
  for windows OS. Bugzilla Report 28874.

* Removed support for xalan1 completely. Users of Xalan1 for Ant builds will
  have to stay at ant 1.6.5 or upgrade to xalan2.

* Use org.apache.log4j.Logger instead of org.apache.log4j.Category.
  Category has been deprecated for ~2 years and has been removed from
  the log4j code.  Logger was introduced in log4j 1.2 so users of
  log4j 1.1 and log4j 1.0 need to upgrade to a newer version of log4j.
  Bugzilla Report 31951.

* build.sysclasspath now also affects the bootclasspath handling of
  spawned Java VMs.  If you set build.sysclasspath to anything other
  than "ignore" (or leave it unset, since "ignore" is the default when
  it comes to bootclasspath handling), then the bootclasspath of the
  VM running Ant will be added to the bootclasspath you've specified.

* The <java fork="false"> now as per default installs a security manager
  using the default permissions. This is now independent of the
  failonerror attribute.  Bugzilla report 33361.

* <signjar> now notices when the jar and signedjar are equal, and switches
  to the same dependency logic as when signedjar is omitted. This may break
  something that depended upon signing in this situation. However, since
  invoking the JDK jarsigner program with -signedjar set to the source jar
  actually crashes the JVM on our (Java1.5) systems, we don't think any
  build files which actually worked will be affected by the change.

* <signjar> used to ignore a nested fileset when a jar was also provided as an
  attribute, printing a warning message; now it signs files in the fileset.

* An improved method of handling timestamp granularity differences between
  client and server was added to the <ftp> task.  FTP servers typically
  have HH:mm timestamps whereas local filesystems have HH:mm:ss timestamps.
  Previously, this required tweaking with the timediffmillis attribute
  which also was used to handle timezone differences.  Now, there is a new
  timestampgranularity attribute.  The default value for get operations is 0
  since the user has the more powerful preservelastmodified attribute to work
  with.  Since this is not available on put operations the default value
  adds a minute to the server timestamp in order to account for this,
  Scripts which previously used timediffmillis to do this compensation may
  need to be rewritten.  timediffmillis has now been deprecated.

* Support for the XSL:P XML parser has been removed.
  Bugzilla Report 23455.

* Visual Age for Java optional tasks removed as the required library is no
  longer available.

* Testlet (test) optional task removed as the required library is no
  longer available.

* IContract optional task removed as the required library is no
  longer available.

* Metamata (maudit, mmetrics, and mparse tasks) removed as the required
  library is no longer available.

* Sitraka (jpcoverage, jpcovmerge, jpcovreport) tasks suppressed as the
  required library is no longer available.

* <fixcrlf> used \r (Mac) line endings on OS X, whose proper line separator
  is \n (Unix).  Bugzilla report 39585.

* <scp> now optionally supports the sftp protocol, you may need a
  newer jsch.jar.  Bugzilla Report 39373.

* Ant launcher program prints errors to stderr, and exits with a 2 exit code
  value if, for any reason, it cannot actually start Ant proper. This will only
  affect programs/scripts that called the launcher and which did not want to
  receive an error if Ant itself would not start

* All .NET tasks are now deprecated in favor of the new .NET Antlib:
  http://ant.apache.org/antlibs/dotnet/index.html

Fixed bugs:
-----------
* Directory deletion did not work properly.
  Bugzilla 40972.

* docletpath attribute of javadoc was ignored.
  Bugzilla 40900.

* Fixed incorrect recursion in DOMUtil.listChildNodes().
  Bugzilla 40918.

* CompressedResource.compareTo() did not
  take comparison with another CompressedResource into account.
  Bugzilla 40949.

* Avoid possible NPE in Jar.java.
  Bugzilla 40847.

* regression in attribute prefix (+ others) for refid in zipfileset and tarfileset.
  Bugzilla 41004, 30498.

* dependset failed if the basedir of a target fileset did not exist.
  Bugzilla 40916.

* Recursive filtering encountered NullPointerExceptions under certain
  circumstances.  Bugzilla 41086.

* XmlProperty overrides previously set property value when handling duplicate
  elements. Bugzilla 41080.

* Having many tasks causes OOM.  Bugzilla 41049.

* Regression: <path> was evaluating nested content only once, so that it could
  not e.g. pick up files that didn't exist the first time through.
  Bugzilla 41151.

* OOM caused by IH holding on to classes and thus their classloaders.
  Bugzilla 28283 and 33061.

* <delete> doesn't delete when defaultexcludes="false" and no includes is set
  fixed. Bugzilla 40313.

* Behavior change of DirectoryScanner/AbstractFileset when conditional include
  patterns are used. Bugzilla 40722.

* <javac> fails with NPE when compiling with eclipse ecj 3.1.x.
  Bugzilla 40839.

* JUnitTestRunner had a NPE when unable to create parser, the exception
  containing the error did not get reported. Bugzilla 36733.

* <checksum> with file and todir option failed. Bugzilla report 37386.

* <path location="loc"> was broken (Regression from beta1).
  Bugzilla report 40547.

* Nested fileset in <cab> did not work. Bugzilla report 39439.

* The ant wrapper script should now correctly locate the java
  executable in more recent IBM JDKs for AIX as well.

* URLResource did not close jar files, and also did not disconnect HTTPConnection (s).

* Error calling junitreport. Bugzilla 40595.

* <junittask/> created junitvmwatcher*.properties files but did not close and delete them.

* <xmlproperty> did not create properties for empty leaf elements.
  Bugzilla report 26286.

* UnknownElement.maybeConfigure always configured.
  Bugzilla report 40641.

* No check for refid when prefix attribute is set in zipfileset.
  Bugzilla report 30498.

* Fix for junit4 issue introduced since beta2.
  Bugzilla report 40682.

* Error in duplicate project name with <import> and <antcall>.
  Bugzilla report 39920.

* junit4 did not work with fork=no and junit4 in $ANT_HOME/lib.
  Bugzilla report 40697.

* PathConvert on Windows should process forward and back slashes equivalently.
  Bugzilla report 32884.

* ant.bat now looks in %USERPROFILE% and %HOMEDRIVE%%HOMEPATH% in addition to
  %HOME% for pre/post batch files. Bugzilla report 39298.

* The inheritance hierarchy of the legacy <path> type was changed; code built
  against Ant 1.7 would therefore no longer execute on older versions of Ant.
  Since <path> is historically heavily used this was undesirable, and since it
  is also avoidable, the change to <path>'s taxonomy was reverted.

* <zip filesonly="true"> included empty directories.  Bugzilla report 40258.

* Invalid hash code of Target causes XmlLogger to fail.
  Bugzilla report 40207.

* Macro element did not include top level Text. Bugzilla report 36803.

* AntClassLoader did not isolate resources when isolate was set. Bugzilla report 38747.

* Diagnostics broken when using java 1.4. Bugzilla report 40395.

* Exception reporting in <copy> was broken. Bugzilla report 40300.

* Handling of corrupt tar files, TarInputStream.read() never returns EOF.
  Bugzilla report 39924.

* Some bugs in ReaderInputStream. Bugzilla report 39635.

* <antlr> did not recognise whether the target is up-to-date for html option.
  Bugzilla report 38451.

* Documented minimal version of jsch now 0.1.29.
  Bugzilla report 40333.

* <available> searched parent directories for files.
  Bugzilla report 37148.

* The build could be halted if a file path contained more ".." components than
  the actual depth of the preceding path. Now such paths are left
  alone (meaning they will likely be treated as nonexistent
  files). Bugzilla Report 40281.

* Converting a <dirset> to a string was broken. Bugzilla Report 39683.

* Manifests have improved line length handling, taking care of encoding.
  Bug reports 37548 / 34425.

* <manifest> now closes the inputstream explicitly. Bug report 39628.

* <rpm> now also correctly searches the first element of the path.
  Bug report 39345.

* ant.bat now handles classpath set to "". Bug report 38914.

* <junit> now supports JUnit 4. Bugzilla Report 38811.

* <junit> can now work with junit.jar in its <classpath>. Bugzilla
  Report 38799.

* Some potential NullPointerExceptions, Bugzilla Reports 37765 and 38056.

* Problem when adding multiple filter files, Bugzilla Report 37341.

* Problem referencing jars specified by Class-Path attribute in manifest
  of a ant task jar file, when this ant task jar file is located in
  a directory with space, Bugzilla Report 37085.

* Backward incompatible change in ZipFileSet, Bugzilla Report 35824.

* Wrong replacement of file separator chars prevens junitbatchtest
  from running correctly on files from a zipfileset. Bugzilla Report 35499.

* Calling close twice on ReaderInputStream gave a nullpointer exception.
  Bugzilla Report 35544.

* Memory leak from IntrospectionHelper.getHelper(Class) in embedded
  environments. Bugzilla Report 30162.

* Translate task does not remove tokens when a key is not found.
  It logs a verbose message.  Bugzilla Report 13936.

* Incorrect task name with invalid "javac" task after a "presetdef".
  Bugzilla reports 31389 and 29499.

* <manifest> was not printing warnings about invalid manifest elements.
  Bugzilla report 32190.

* <replace> got out of memory on large files (part of report 32566).
  <replace> can now handle files as long as there is enough disk space
  available.

* Commandline.describeCommand() methods would attempt to describe
  arguments even when none, other than the executable name, were present.

* Create signjar's helper ExecTask instance directly rather than by
  typedef discovery mechanisms. Bugzilla report 33433.

* FileUtils.resolveFile() promised to return absolute files but
  did not always do so.

* <ftp> failed to retrieve a file when the path towards the file contained
  an element starting with . Bugzilla report 33770.

* "<rmic> always compiles on Java1.5" bugzilla report=33862. Fixed default
  stub version to always be "compat", even on Java1.5+.

* The .NET compilation tasks failed if filenames given as references
  contained spaces.  Bugzilla Report 27170.

* SQL task would try access result sets of statements that didn't
  return any, causing problems with Informix IDS 9.2 and IBM DB2 8.1
  FixPak 6 (or later). Bugzilla Reports 27162 and 29954.

* Task.init() was called twice for most tasks.  Bugzilla Report 34411.

* JavaTest testcases sometimes fail on windows. Bugzilla Report 34502.

* Targets with identical name work in imported project. Bugzilla Report 34566.

* DemuxOutputStream now uses a WeakHashMap to store the thread-stream mapping,
  to avoid holding on to thread references after they terminate.

* <xmlvalidate> and <schemavalidate> create a new parser for every file in a
  fileset, and so validate multiple files properly. Bugzilla Report 32791.

* <tar> / <untar> now accepts files upto 8GB, <tar> gives an error if larger
  files are to be included. This is the POSIX size limit.

* <junitreport> removed line-breaks from stack-traces.  Bugzilla
  Report 34963.

* Off-by-one error in environment setup for execution under OpenVMS fixed.

* Bugzilla report 36171: -noclasspath crashes ant if no system
  classpath is set.

* <pvcs> used wrong switch for retrieving revisions by label.
  Bugzilla Report 36359.

* <sshexec> closed System.out, disabling output on second and subsequent
  invocations.  Bugzilla report 36302.

* <cvschangelog> was crashing with CVS versions >= 1.12.x due to change in
  the date format. Bugzilla report 30962.

* The same IntrospectionHelper instance was continuously added as a listener
  to project. Bugzilla report 37184.

* FileUtils.toURI() was not encoding non-ASCII characters to ASCII,
  causing impossibility to process XML entities referenced by XML
  documents in non ASCII paths. Bugzilla report 37348.

* > 1 ssh invocations to a given host would fail. Bugzilla report 36207.

* EmailTask was eating SMTP error messages. Bugzilla report 37547.

* PropertySet API setMapper(...) didn't properly set up the Mapper.
  Bugzilla report 37760.

* Proper return code for ant.bat. Bugzilla report 13655.

* Project not set on ChainReaderHelpers used by the Redirector.
  Bugzilla report 37958.

* Copy task would fail on locked (or otherwise uncopyable) files even if
  failonerror set to false. Bugzilla report 38175.

* <junit> task did not print all the Test names when using forkmode='once'.
  Bugzilla report 37426.

* <available> could leak resources, Bugzilla Report 38260.

* Redirector called Thread.sleep in a synchronized block. Bugzilla
  report 37767.

* CCUnlock's objselect attribute could exhibit unpredictable behavior;
  standardized improperly included objselect and objsel property accessors to
  delegate to the inherited objSelect property accessor. Bugzilla report 37766.

* <unzip> and <untar> now correctly merge multiple nested patternsets.
  Bugzilla Report 38973.

* On case-insensitive filesystems, a <move> to change filename case
  erroneously deleted the "destination" file before attempting to rename
  the source file.  Bugzilla 37701.

* <scp> can now handle uris with @s other than the final one denoting the
  domain.  Bugzilla 38082.

* If the class invoked by the <java> task threw a ClassNotFoundException,
  this was misinterpreted as the specified class itself not being found.

* <echoproperties> setPrefix javadoc claimed null or empty prefix would be
  ignored; instead an error was thrown.  Bugzilla report 39954.

* <get> would fetch files that were up to date, because it used > in a
  remote/local timestamp comparison, not >=. Bugzilla 35607.

* <xslt> passes the current file (name + directory) to the
  stylesheet/transformation.  xsl-parameter name is configurable.
  Bugzilla report 21042.

* The <zip> API allowed creation of directories in file-only archives; a
  habitual offender was the subclassed <jar>, which included META-INF/ in
  the destination file regardless of whether filesonly was set to true.

* <rmic> has a new adapter, xnew, to use the -XNew back end on java1.5+.
  By forking rmic, this works on java1.6+. Bugzilla report 38732.

* Copy of UnknownElement in macroinstance was not recursive.
  Bugzilla report 40238.

* Mixing of add and addConfigured methods in Mapper/ChainedMapper
  causes incorrect chaining. Bugzilla report 40228.

Other changes:
--------------

* Warn user when a reference in the form "${refid}" cannot be resolved as this
  is a sign they probably meant "refid" (misuse of property expansion syntax).

* Add dtd to javadoc for junit.
  Bugzilla 40754.

* Add quiet attribute to loadfile/resource.
  Bugzilla 38249.

* Make Locator#fromURI also append the drive letter when running under Windows
  with JDK 1.3 or 1.2.

* Do not uppercase the drive letters systematically in FileUtils#normalize.

* Java 5 enumerations may now be used as values in XML attributes in place of
  EnumeratedAttribute. Bugzilla 41058.

* Create a pom file for ant-testutil and add ant-testutil.jar to the ant
  distribution. Bugzilla 40980.

* Roll back automatic proxy enabling on Java 1.5. It broke things like
  Oracle JDBC drivers, and Ant itself on IBM's JVM on AIX, and didn't
  seem to work to well the rest of the time.
  To enable the feature, use the -autoproxy command line option.

* Upgraded XML API and parser to Xerces 2.8.1

* A code review of some threaded logic has tightened up the synchronization
  of Watchdog, ExecuteWatchdog and ExecuteJava, which could reduce the occurrence
  of race conditions here, especially on Java1.5+.

* Allow broken reference build files. The defer reference processing would
  break too many files - so allow them with a warning.

* Removed dependency on sun.misc.UUEncoder for UUMailer.

* Added regex attribute to the echoproperties task.
  Bugzilla 40019.

* <war> task now allows you to omit the web.xml file. as this is optional
  in the servlet 2.5 and Java EE 5 APIs. set needxmlfile="false" to
  avoid a missing web.xml file from halting the build.

* Diagnostics catches and logs security exceptions when accessing system properties.

* <javadoc> useexternalfile now applies to all command line arguments
  of javadoc. Bugzilla report 40852.

* javadoc/tag@description is now set to the name if description is
  not specified. Bugzill report 32927.

* Some performance improvements, including Bugzilla report 25778.

* Add <matches> condition. Bugzilla report 28883.

* Extending JAR-Task for SPI. Bugzilla report 31520.

* Added <tokens> resource collection for convenient creation of string
  resources from other resources' content. Inspired by Bugzilla 40504.

* Added <compare> resource selector to select resources based on the
  results of their comparison to other resources.

* Added outputtoformatters attribute to <junit> to allow suppression
  of noisey tests. Bugzilla report 12817.

* Log level of message 'Overriding previous definition of reference to'
  set to Verbose. Bugzilla report 17240.

* Added setbeans attribute to <script> to allow <script>'s to be
  run without referencing all references.
  Bugzilla report 37688.

* Added classpath attribute and nested element to <script> to allow
  the language jars to be specified in the build script.
  Bugzilla report 29676.

* Trim the driver attribute on the <sql> task. Bugzilla report 21228.

* Allow (jar) files as well as directories to be given to jdepend.
  Bugzilla report 28865.

* Convert SplashTask to use NOT sun internal classes.
  Bugzilla report 35619.

* Made PatternSet#hasPatterns public to allow custom filesets access.
  Bugzilla report 36772.

* Added searchparents attribute to <available>. Bugzilla report 39549.

* Tasks that don't extend Ant's Task class will now get the build file
  location reflected into a method of the signature void setLocation(Location)
  - if such a method exists.

* Remove needless synchronization in DirectoryScanner.
  Bugzilla report 40237.

* Improved recursion detection for lines with multiple matches of same token
  on a single line.  Bugzilla report 38456.

* Task will now log correctly even if no project is set.
  Bugzilla report 38458.

* Use alternative names for the command line arguments in javac. Bugzilla
  Report 37546.

* The Reference class now has a project field that will get
  used (if set) in preference to the passed in project, when
  dereferencing the reference. Bugzilla Report 25777.

* On DOS and Netware, filenames beginning with a drive letter
  and followed by a colon but with no directory separator following
  the colon are no longer (incorrectly) accepted as absolute pathnames
  by FileUtils.normalize() and FileUtils.isAbsolutePath().  Netware
  volumes can still be specified without an intervening separator.
  UNC pathnames on Windows must include a server and share name, i.e.
  "\\a\b" to be considered valid absolute paths.

* A bug in SQLExec would prevent the execution of trailing,
  non-semicolon-delimited statements.  Bugzilla Report 37764.

* InputHandler implementations may now call InputRequest.getDefaultValue()
  if they wish. The default handler uses this also. Bugzilla report 28621.

* Took in bugzilla report 39320, "Simple code cleanups"

* Improve compatibility with GNU Classpath and java versions prior to
  1.5. Bugzilla 39027.

* ${ant.core.lib} may now be used to refer to the library containing the
  Ant classes, for instance useful when compiling tasks.

* Minor performance improvements Bugzilla report 37777

* New task <manifestclasspath> converts a path into a property
  suitable as the value for a manifest's Class-Path attribute.

* Fixed references to obsoleted CVS web site. Bugzilla Report 36854.

* Log fine-grained events at verbose level from JUnit. Bugzilla report 31885.

* <WsdlToDotnet> and <style> are now deprecated in favor of <wsdltodotnet> and
  <xslt>, respectively. Bugzilla report 25832.

* <echoproperties> now (alphanumerically) sorts the property list
  before echoing. Bugzilla report 18976.

* A new base class DispatchTask has been added to facilitate elegant
  creation of tasks with multiple actions.

* Major revision of <wsdltodotnet>. Supports mono wsdl and the microsoft
  wsdl run on mono, as well as most of the .NET WSE2.0 options. Extra
  schemas (files or urls) can be named in the <schema> element.
  Compilers can be selected using the compiler attribute, which defaults
  to "microsoft" on windows, and "mono" on everything else.

* It is now possible to specify the pattern created/parsed by <checksum>.
  Bugzilla Report 16539.

* Added a new "failall" value for the onerror attribute of <typedef>.
  Bugzilla report 31685.

* unzip/unwar/unjar/untar now supports a nested mapper, which lets you unzip
  in useful ways.

* Junit task -- display suite first.
  Bugzilla report 31962.

* Added isSigned condition and signedselector selector
  Bugzilla report 32126.

* Added preserveLastModified attribute to signjar task.
  Bugzilla report 30987.

* Added <scriptcondition> condition, for inline scripted conditions

* Added <xor> condition for exclusive-or combining of nested conditions.

* Added <scriptselector> selector for scripted file selection

* ant -diagnostics lists contents of ${user.home}/.ant/lib , and
  checks that the java.io.tmpdir directory exists and is writeable.

* mail task accepts nested header element.  Bugzilla report 24713.

* zip/jar/war/ear supports level attribute for deflate compression level.
  Bugzilla report 25513.

* Added loginputstring attribute to the redirector type.

* Tighten security by sending storepass and keypass to signjar
  via the input stream of the forked process.

* New task <schemavalidate> extends <xmlvalidate> with extra support
  for XML Schema (XSD) files.

* <fixcrlf> supports a file attribute for easy fixup of a single file.

* New condition <parsersupports> which can look for XML parser feature or
  property support in the parser Ant is using.

* fixcrlf can be used in a filterchain.

* <sync> has a new nested element <preserveInTarget> that can be used
  to protect extra-content in the target directory.  Bugzilla Report
  21832.

* <signjar> now supports:
  -nested filesets at the same time as the jar attribute
  -a destDir attribute with the appropriate dependency logic, which
   can be used with the jar attribute or nested filesets
  -a mapper to permit filename remapping on signing
  -tsaurl and tsacert attributes for timestamped JAR signing
  -nested <sysproperty> elements, which can be used for proxy setup
  and the like

* The linecontains and linecontainsregexp filterreaders now support a
  negate attribute to select lines -not- containing specified text.
  Bugzilla Report 34374.

* <os> condition adds "winnt" as a family which can be tested. This is
  all windows platforms other than the Win9x line or Windows CE.

* <exec> (and hence, <apply> and any other derived classes) have an OsFamily
  attribute, which can restrict execution to a single OS family.

* Added "backtrace" attribute to macrodef. Bugzilla report 27219.

* Ant main provides some diagnostics if it ever sees a -cp or -lib option,
  as this is indicative of a script mismatch. Bugzilla report 34860

* <junitreport> prints a special message if supplied an empty XML File. This
  can be caused by the test JVM exiting during a test, either via a
  System.exit() call or a JVM crash.

* Project name is now used for *all* targets so one can write consistent import
  build files. Bugzilla report 28444.

* New condition <typefound> that can be used to probe for the declaration
  and implementation of a task, type, preset, macro, scriptdef, whatever.
  As it tests for the implementation, it can be used to check for optional
  tasks being available.

* Check for 1.5.* Ant main class. (weblogic.jar in classpath reports)

* New condition <isfailure> that tests the return-code of an executable. This
  contains platform-specific logic and is better than comparing the result with
  "0".

* Added initial support for Resource Collections, including the
  resourcecount task.

* property attribute of pathconvert is now optional. If omitted the
  result will be written to the log.

* New mapper, <scriptmapper>, supports scripted mapping of source files/strings
  to destination strings.

* Add the echoxml task. This will echo nested XML to a file, with
  the normal <?xml ?> processor instruction. UTF-8 encoding only; no-namespace
  support.

* Try to make subprojects of custom Project subclasses instances of the
  same type. Bugzilla report 17901.

* <ssh> and <scp> support keyboard-interactive authentication now.

* <javadoc> now supports -breakiterator for custom doclets if Ant is
  running on JSE 5.0 or higher.  Bugzilla Report: 34580.

* New logger, TimestampedLogger, that prints the wall time that a build
  finished/failed. Use with
  -logger org.apache.tools.ant.listener.TimestampedLogger

* <junitreport> now generates pages alltests-errors.html and
  alltests-fails.html, that list only the errors and failures, respectively.
  Bugzilla Report: 36226

* New task <makeurl> that can turn a file reference into an absolute file://
  url; and nested filesets/paths into a (space, comma, whatever) separated
  list of URLs. Useful for RMI classpath setup, amongst other things.

* <xslt> now accepts nested FileNameMappers e.g. <globmapper>.
  Bugzilla report 37604.

* New task <loadresource> that accompanies <loadfile> for non file resources.

* <echo> now supports an encoding when saving to a file.

* New GreedyInputHandler added.

* Add textfile attribute to the <filesmatch> condition. When true, the text
  contents of the two files are compared, ignoring line ending differences.

* New <resourcesmatch> condition.

* Added the onmissingfiltersfile attribute to filterset. Bugzilla report 19845.

* Added the inline handler element to the input task.

* <sql> supports property expansion if you set the expandProperties
  attribute. By default it does not expand properties, something we
  dare not change for fear of breaking complex SQL operations in
  existing files.

* <javadoc>'s packagenames attribute is now optional and defaults to "*".

* <javac>'s source and target attributes as well as <javadoc>'s source
  attribute will read default values from the properties
  ant.build.javac.source and ant.build.javac.target.

* Handling of ' ', '#' in CLASSPATH and '#' in -lib (cannot use ' '
  in -lib on UNIX at the moment). Bugzilla Report 39295.

* <scp> now optionally supports the sftp protocol.  Bugzilla Report 39373.

* Resources can now be used to indicate the location of the stylesheet to use
  in <xslt>. Bugzilla Report 39407.

* New <antversion> condition. Bugzilla report 32804.

* ReplaceTokens should allow properties files. Bugzilla report 39688.

* FTP Account could not be specified in ant FTP task. Bugzilla report 39720.

* Minor performance updates. Bugzilla report 39565.

* New deleteonexit attribute for the <tempfile> task. Bugzilla report 39842.
  Remember that the exit of the JVM can be a long time coming,
  especially under an IDE. Don't rely on this being called.

* <scriptdef>-created scripts have support for nested text. All text
  passed to a scripted task can be accessed via self.text.

* <fixcrlf> now supports an outputencoding attribute.  Bugzilla report 39697.

* <junitreport> now supports nested XSL parameters. Bugzilla report 39708.

* <javacc> has a jdkversion attribute to pass the desired JDK version
  down to javacc.  Bugzilla report 38715.

* <cvs> prints passfile info at -verbose level instead of -info. Bugzilla
  report 35268

* When <javac> can't find the compiler class, it prints out java.home for
  immediate diagnostics

* Ant launcher now supports a -main attribute so that you can specify
  an extension class to the built in org.apache.tools.ant.Main
  class. This class must implement the interface AntMain

Changes from Ant 1.6.4 to Ant 1.6.5
===================================

Changes that could break older environments:
--------------------------------------------

Fixed bugs:
-----------

* <move> was unable to replace existing files or write into
  existing directories.  Bugzilla report 34962.

* <macrodef> with redefined default values was incorrect. (Fix for
   31215 had a bug). Bugzilla report 35109.

* <javadoc> will convert backslashes to forwardslashes when generating file
  list by useexternalfile. Bugzilla report 27814.

Changes from Ant 1.6.3 to Ant 1.6.4
===================================

Changes that could break older environments:
--------------------------------------------
* <ftp> task has had a number of changes.  Uptodate calculation previously
  did not call a file uptodate if the source timestamp and the destination
  timestamp were equal. Bugzilla report 34941.  Any script that attempted
  to compensate for this by using the timediffmillis attribute might need
  to be tweaked.


Fixed bugs:
-----------

* Sun javah failed with java.lang.NoClassDefFoundError.
  Bugzilla report 34681.

* DirectoryScanner.slowScan() was broken. Bugzilla report 34722.

* DirectoryScanner.scan() could throw a NullPointerException on
  case-insensitive filesystems (read Windows or MacOS X).

* Get w/authentication failed with ArrayOutOfBoundsExceptions.
  Bugzilla report 34734.

* Granularity attribute for <sync> task was undocumented.
  Bugzilla report 34871.

* <unzip> and <untar> could leave file handles open on invalid
  archives.  Bugzilla report 34893.

* propertyset threw NPE with nested, mapped propertysets.

Other changes:
--------------

* AntXMLContext.setCurrentTargets() is now public. Bugzilla report 34680.

Changes from Ant 1.6.2 to Ant 1.6.3
===================================

Changes that could break older environments:
--------------------------------------------

* The subant task used the canonical version of a file path. This
  has been changed to use the absolute path. Bugzilla 30438.

* Tar now writes two EOF blocks rather than one.
  Bugzilla report 28776

* The Reference object now has a project field which it uses in preference
  to the project passed in. This allows composite references to be
  handled to nested projects.
  Bugzilla report 25777

* <junit> with filtertrace="true" will now also swallow lines for the
  sun.reflect package.  If you need to see them in your stack trace,
  you must set filtertrace to false.
  Bugzilla Report 22758

* The jikes compiler adapter now supports -bootclasspath, -extdirs and
  -sourcepath and also uses the same logic for debug flags as javac.
  This means, the jikes compiler adapter now requires Jikes 1.15 or later.
  Bugzilla Reports 25868, 26404 and 32609.

* The gcj compiler adapter used to include the Java runtime classes
  even if includeJavaRuntime was set to false, unless the
  bootclasspath has been specified as well.  It will now always adhere
  to includeJavaRuntime, you may need to set it to true explicitly now
  if you relied on the old behavior.

Other changes:
--------------

* <javadoc> can now take an attribute 'executable'. Bugzilla report 30606.

* New attribute ignorecontents for <different> selector

* Javadoc fixes for Location, Project, and RuntimeConfigurable
  Bugzilla 30160.

* Enable to choose the regexp implementation without system property.
  Bugzilla Report 15390.

* Expose objects and methods in IntrospectionHelper. Bugzilla Report 30794.

* Allow file attribute of <move> to rename a directory.
  Bugzilla Report 22863.

* Add xmlcatalog nested element to XmlProperty. Bugzilla report 27053.

* New attribute alwayslog for <redirector> type.

* Added <target> nested elements to <ant> and <antcall> to allow
  specification of multiple sub-build targets, which are executed
  with a single dependency analysis.

* Refactored Target invocation into org.apache.tools.ant.Executor
  implementations.  Bugzilla Reports 21421, 29248.

* <rmic> now also supports Kaffe's rmic version shipping with Kaffe
  1.1.2 and above.

* added casesensitive attribute to <globmapper> and <regexpmapper>
  Bugzilla report 16686

* added handledirsep attribute to <globmapper> and <regexpmapper>
  Bugzilla report 32487

* added a new mapper <filtermapper>

* When a BuildListener tried to access System.err or System.out, Ant
  would have thrown an exception - this has been changed.  Ant now
  silently ignores the message.  BuildListeners still should avoid
  accessing either stream.

* Added a comment attribute to the zip task.
  Bugzilla report 22793.

* Overloaded FileUtils.createNewFile with a boolean mkdirs attribute
  to create nonexistent parent directories.

* <apply> has a new "force" attribute that, when true, disables
  checking of target files.

* Made the dest attribute of the apply task optional; mapped target
  filenames will be interpreted as absolute pathnames when dest is omitted.

* Changed default tempdir for <javac> from user.dir to java.io.tmpdir.

* Added searchpath attribute to <exec> for searching path variable(s)
  when resolveexecutable = true.

* Added revision and userid attributes to <pvcs> documentation.

* Added support to the touch task for a mkdirs attribute to create
  nonexistent parent directories before touching new files.

* Added support to the touch task for a pattern attribute to allow
  alternate datetime formats.

* Added support to the touch task to map touched files using a nested
  mapper element.

* Added support to the touch task for a verbose attribute to suppress
  logging of new file creation.

* bad link in docs to the enhancement page in bugzilla.
  Bugzilla report 33252.

* Added length task to get strings' and files' lengths.

* <native2ascii> and <javah> now also support Kaffe's versions.

* Recursive token expansion in a filterset can now be disabled by
  setting its recurse attribute to false.

* Pathconvert no longer requires that one of (targetos|pathsep|dirsep)
  be set; platform defaults are used when this is the case.

* Added preservelastmodified attribute to fixcrlf task. Bugzilla 25770.

* Added isfileselected condition.

* Added verbose="true|false" attribute to <subant>. When verbose is enabled,
  the directory name is logged on entry and exit of the sub-build.
  Bugzilla 33787.

* Added -nouserlib option to allow running ant without automatically loading
  up ${user.home}/.lib/ant. This is useful when compiling ant, and antlibs.
  Modified the build.sh and build.bat to use the option.

* Added -noclasspath option to allow running ant WITHOUT using CLASSPATH env
  variable. Modified ant.bat to do this so that %CLASSPATH% is not looked at.

* Add else attribute to the condition task, which specifies an
  optional alternate value to set the property to if the nested
  condition evaluates to false. Bugzilla report 33074.

* Ant generated jar files should now be detected as jar files by
  Solaris.  Bugzilla Report 32649.

* <rexec> with a single command should now work with unusal login
  dialogs without special read/write pairs.  Bugzilla Report 26632.

* <csc>'s extraoptions can now contain multiple arguments.
  Bugzilla Report 23599.

* <macrodef> with default values set by properties would be
  seen as new definitions when called twice with different properties.
  This was confusing so the definitions are now treated as similar.
  Bugzilla Report 31215.

* <javadoc> has a new attribute "includenosourcepackages" that can be
  used to document packages that don't hold source files but a
  package.html file.  Bugzilla Report 25339.

* <rpm> has new attributes failonerror and quiet.

* Added two tutorials
  - beginner: introduction into Ant
  - task developers: using path, fileset etc

* a number of new attributes that allow the user to handle non-standard
  server listing formats and time zone differences have been added in
  the <ftp> task.


Fixed bugs:
-----------

* Do not pass on ThreadDeath when halting <java fork="false">. Bugzilla
  32941.

* Killing a thread running <java fork="true"> (e.g. from an IDE) would
  not stop the forked process. Bugzilla 31928.

* Programs run with <java fork="true"> can now accept standard input
  from the Ant console.  (Programs run with <java fork="false"> could
  already do so.)  Bugzilla 24918.

* AbstractCvsTask prematurely closed its outputStream and errorStream.
  Bugzilla 30097.

* Impossible to use implicit classpath for <taskdef>
  when Ant core loader != Java application loader and
  Path.systemClassPath taken from ${java.class.path} Bugzilla 30161.

* MacroInstance did not clean up nested elements correctly in the execute
  method, causing multiple use of the same macro instance with nested
  elements to fail.

* checksum fileext property doc wrong. Bugzilla 30787.

* FTP task, getTimeDiff method was returning wrong value. Bugzilla 30595.

* make sure that Zip and its derivatives call the createEmptyZip method when
 there are no resources to zip/jar/...

* Zip task was not zipping when only empty directories were found.
  Bugzilla 30365.

* Jar task was not including manifest files when duplicate="preserve" was
  chosen. Bugzilla 32802.

* ant.bat was missing runAntNoClasspath label for goto.
  Bugzilla 34510.

* Classpath was treated in the same way as -lib options. Bugzilla 28046.

* Manual page for cvsversion contained incorrect attributes and did not
  say since 1.6.1. Bugzilla 31408.

* Typo in definition of <cvsversion> task causing it not to be defined.
  Bugzilla 31403.

* Execution of top level tasks in imported files get delayed by targets.
  Bugzilla report 31487.

* ExecTask executes checkConfiguration() even though os does not match.
  Bugzilla report 31805.

* Concat task instance could not be run twice.
  Bugzilla report 31814.

* NPE using XmlLogger and antlib.
  Bugzilla report 31840.

* Properties.propertyNames() should be used instead of .keys().
  Bugzilla report 27261.

* Target location is not set for default target.
  Bugzilla report 32267.

* Incorrect classloader parent in junittask when using with
  ant-junit.jar and junit.jar not in the project classloader. Bugzilla
  report 28474.

* getResources() on the classloader returned by ClasspathUtils would
  see each resource twice - if the resource is in the project
  classpath and if the classloader is requested with a null path.

* XMLValidate used URL#getFile rather than the ant method FileUtils#fromURI
  Bugzilla report 32508

* fixed Regexp-Mapper docs which gave outdated instructions (optional.jar)
  Bugzilla report 28584

* <scp> using <fileset> didn't work with OpenSSH 3.9 and later.
  Bugzilla report 31939

* <setproxy> failed to set user/password on some JDKs.
  Bugzilla report 32667

* untar would go into infinite loop for some invalid tar files.
  Bugzilla report 29877

* forked <javac> won't pass -source to a JDK 1.1 or 1.2 javac anymore.
  Bugzilla report 32948

* propertyset references did not handle nested propertyset references.

* oata.types.Description.getDescription(Project) would throw a
  NullPointerException when the "ant.targets" reference was unset.

* Wrapper scripts did not detect WINNT value of dynamic OS environment
  variable when logged into workstations using Novell authentication.
  Bugzilla Report 30366.

* DependScanner.getResource() always returned nonexistent resources,
  even when the resource actually existed.  Bugzilla Report 30558.

* <apply> was broken with classfilesets.  Bugzilla Report 30567.

* <available> returned false positives when checking a file
  passed in with the current basedir leading twice:
  e.g. ${basedir}${file.separator}${basedir}${file.separator}foo .

* The first file open that took place when using input files with the
  <exec>, <apply>, or <java> tasks was always logged to System.out
  instead of to the managing Task.

* <telnet> and <rexec> would try to disconnect from servers they never
  connetced to, potentially leading to exceptions in commons-net.
  Bugzilla Report 33618.

* <zip> would drop files matched by defaultexcludes during updates.
  Bugzilla Report 33412.

* <zip> couldn't store files with size between 2GB and 4GB (the
  upper limit set by the ZIP format itself).  Bugzilla Report 33310.

* NPE when when <presetdef> tries to configure a task that
  cannot be instantiated. Bugzilla Report 33689.

* <javac debug="false"> created an invalid command line when running
  the Symantec Java compiler.

* Get with usetimestamp did not work on Java 1.2.

* Get with usetimestamp did not work when local timestamp roughly >= now.

* The framed JUnit report now handles multiple reports for the same
  testcase properly.  Bugzilla Report 32745.

* <cab> didn't work for files with spaces in their names on Windows.
  Bugzilla Report 17182.

* The VAJ tasks could fail if the project name contained characters
  that need to get URL encoded.  Bugzilla Report 23322.

* TarInputStream#read() wasn't implemented correctly.  Bugzilla Report
  34097.

* <xslt> failed to process file-hierarchies of more than one level if
  scanincludeddirectories was true.  Bugzilla Report 24866.

* forkmode="perBatch" or "once" would ignore extension attributes that
  had been specified for <formatter>s.  Bugzilla Report 32973.

* The refid attribute of the I/O redirector was not functional.

Changes from Ant 1.6.1 to Ant 1.6.2
===================================

Changes that could break older environments:
--------------------------------------------

* The import task used the canonical version of a file path. This
  has been changed to use the absolute path. Bugzilla 28505.

* ant-xalan2.jar has been removed since the only class contained in it
  didn't depend on Xalan-J 2 at all.  Its sole dependency has always
  been TraX and so it has been merged into ant-trax.jar.

* All exceptions thrown by tasks are now wrapped in a buildexception
  giving the location in the buildfile of the task.

* Nested elements for namespaced tasks and types may belong to the
  Ant default namespace as well as the task's or type's namespace.

* <junitreport> will very likely no longer work with Xalan-J 1.

  Note that Xalan-J 1 has been deprecated for a very long time and we
  highly recommend that you upgrade.

  If you really need to continue using Xalan-J 1, please copy the
  junit-frames-xalan1.xsl from the distribution's etc directory as
  junit-frames.xsl into a new directory and use the task's styledir
  attribute to point to.  This is the last version of the XSLT
  stylesheet that is expected to be compatible with Xalan-J 1.

Fixed bugs:
-----------

* eliminate memory leak in AntClassLoader. Bugzilla Report 8689.

* subant haltonfailure=false did not catch all failures. Bugzilla Report 27007.

* macrodef @@ escaping was broken.  Bugzilla Report 27069.

* MacroDef did not allow attributes named 'description'. Bugzilla Report 27175.

* Throw build exception if name attribute missing from patternset#NameEntry.
  Bugzilla Report 25982.

* Throw build exception if target repeated in build file, but allow targets
  to be repeated in imported files.

* <apply> didn't compare timestamps of source and targetfiles when
  using a nested <filelist>.  Bugzilla Report 26985.

* tagdiff.xml was broken in ant 1.6.1. Bugzilla Report 27057.

* if the basedir contained .. or . dirs, and the build file name contained
  .. or ., the basedir was set incorrectly. Bugzilla Report 26765.

* regression from ant 1.5, exec task outputted two redundant trailing newlines.
  Bugzilla Report 27546.

* NPE when running commons listener. Bugzilla Report 27373.

* <java> swallowed the stack trace of exceptions thrown by the
  executed program if run in the same VM.

* -projecthelp swallowed (configuration) errors silently.
  Bugzilla report 27732.

* filterset used by filtertask doesn't respect loglevel. Bugzilla Report 27568.

* wrong compare used in ProjectComponent for logging. Bugzilla Report 28070.

* failOnAny attribute for <parallel> was broken. Bugzilla Report 28122.

* If <javac> uses gcj and any of the nested <compilerarg>s implies
  compilation to native code (like -o or --main), Ant will not pass
  the -C switch to gcj.  This means you can now compile to native code
  with gcj which has been impossible in Ant < 1.6.2.

* <import optional="false"> and <import optional="true">
  behaved identically.

* <xslt> now sets the context classloader if you've specified a nested
  <classpath>.  Bugzilla Report 24802.

* <zip> and friends would delete the original file when trying to update
  a read-only archive.  Bugzilla Report 28419.

* <junit> and <assertions> are working together. Bugzilla report 27218

* AntClassLoader#getResource could return invalid URLs.  Bugzilla
  Report 28060.

* Ant failed to locate tools.jar if the jre directory name wasn't all
  lowercase.  Bugzilla Report 25798.

* Redirector exhibited inconsistent behavior with regard to split
  output.  When sent to file only, files would be created in all
  cases; when split file-property, files were only created if
  writes were performed.

* fixed case handling of scriptdef attributes and elements.

* UNC pathnames did not work for ANT_HOME or -lib locations on Windows.
  Bugzilla report 27922.

* replacestring tokenfilter only replaced the first occurrence.

* AntLikeTasksAtTopLevelTest failed on cygwin.

* I/O-intensive processes hung when executed via <exec spawn="true">.
  Bugzilla reports 23893/26852.

* JDependTask did not close an output file. Bugzilla Report 28557.

* Using <macrodef> could break XmlLogger. Bugzilla Report 28993.

* <genkey> no longer requires keytool to be in your PATH.  Bugzilla
  Report 29382.

* <symlink> could create cyclic links.  Bugzilla Report 25181.

* <zip whenempty="skip"> didn't work in a common situation.  Bugzilla
  Report 22865.

* <scp> now properly handles remote files and directories with spaces
  in their names.  Bugzilla Report 26097.

* <scp> now has (local|remote)tofile attributes to rename files on the
  fly.  Bugzilla Report 26758.

* <telnet> and <rexec> didn't close the session.  Bugzilla Report 25935.

* <subant> and XmlLogger didn't play nicley together.

Other changes:
--------------
* doc fix concerning the dependencies of the ftp task
  Bugzilla Report 29334.

* <xmlvalidate> has now a property nested element,
  allowing to set string properties for the parser
  Bugzilla Report 23395.

* Docs fixes for xmlvalidate.html, javadoc.html, starteam.
  Bugzilla Reports 27092, 27284, 27554.

* <pathconvert> now accepts nested <mapper>s.  Bugzilla Report 26364.

* Shipped XML parser is now Xerces-J 2.6.2.

* Added nested file element to filelist.

* spelling fixes, occurred. Bugzilla Report 27282.

* add uid and gid to tarfileset. Bugzilla Report 19120.

* <scp> has a verbose attribute to get some feedback during the
  transfer and new [local|remote][File|Todir] alternatives to file and
  todir that explicitly state the direction of the transfer.

* The OS/2 wrapper scripts have been adapted to use the new launcher.
  Bugzilla Report 28226.

* <sshexec> now also captures stderr output.  Bugzilla Report 28349.

* <xslt> now supports a nested <mapper>.  Bugzilla Report 11249.

* <touch> has filelist support.

* <nice> task lets you set the priority of the current thread; non-forking
  <java> code will inherit this priority in their main thread.

* New attribute "negate" on <propertyset> to invert selection criteria.

* Target now supports a Location member.  Bugzilla Report 28599.

* New "pattern" attribute for <date> selector.

* <junit> has a new forkmode attribute that controls the number of
  Java VMs that get created when forking tests.  This allows you to
  run all tests in a single forked JVM reducing the overhead of VM
  creation a lot.  Bugzilla Report 24697.

* <jar> can now optionally create an index for jars different than the
  one it currently builds as well.  See the new <indexjars> element
  for details.  Bugzilla Report 14255.

* Permit building under JDK 1.5. Bugzilla Report 28996.

* minor Javadoc changes. Bugzilla Report 28998.

* Misc. corrections in SignJar.java. Bugzilla Report 28999.

* Remove redundant <hr> from javah.html. Bugzilla Report 28995.

* Ignore built distributions. Bugzilla Report 28997.

* A new roundup attribute on <zip> and related task can be used to
  control whether the file modification times inside the archive will
  be rounded up or down (since zips only store modification times with
  a granularity of two seconds).  The default remains to round up.
  Bugzilla Report 17934.

* A binary option has been added to <concat>. Bugzilla Report 26312.

* Added DynamicConfiguratorNS, an namespace aware version of
  DynamicConfigurator. Bugzilla Report 28436.

* Add implicit nested element to <macrodef>. Bugzilla Report 25633.

* Add deleteonexit attribute to <delete>.

* Added Target.getIf/Unless().  Bugzilla Report 29320.

* <fail> has a status attribute that can be used to pass an exit
  status back to the command line.

* <fail> accepts a nested <condition>.

* <loadproperties> supports loading from a resource.
  Bugzilla Report 28340.

* Nested file mappers and a container mapper implementation have been
  introduced.  Additionally, the <mapper> element now accepts "defined"
  nested FileNameMapper implementations directly, allowing a usage
  comparable to those of <condition>, <filter>, and <selector>.

* New <redirector> type introduced to provide extreme I/O flexibility.
  Initial support for <exec>, <apply>, and <java> tasks.

* <apply> has a new ignoremissing attribute (default true for BC)
  which will allow nonexistent files specified via <filelist>s to
  be passed to the executable.  Bugzilla Report 29585.

* <junitreport> now also works with Xalan XSLTC and/or JDK 1.5.
  Bugzilla Report 27541.

* <jspc> doesn't work properly with Tomcat 5.x.  We've implemented a
  work-around but don't intend to support future changes in Tomcat
  5.x.  Please use the jspc task that ships with Tomcat instead of
  Ant's.

Changes from Ant 1.6.0 to Ant 1.6.1
=============================================

Changes that could break older environments:
--------------------------------------------

* License is now Apache License 2.0
  see http://www.apache.org/licenses/ for more information

Fixed bugs:
-----------
* Remove a recursive template call in the junit xsls that could trigger a stack
  overflow. It now uses Xalan extensions to call a Java class directly.
  Bugzilla Report 19301

* Fix spurious infinite loop detection for filters (introduced in ant 1.6.0).
  Bugzilla Report 23154.

* Fix handling of default ant namespace for nested elements.

* Fix jboss element of ejb task (introduced in ant 1.6.0).

* <whichresource> failed to load classes correctly.

* Ant could fail to start with a NullPointerException if
  ANT_HOME/lib/ant-launcher.jar was part of the system CLASSPATH.

* presetdef'ed types did not work with the ant-type attribute

* fixed case handling of macrodef attributes and elements. Bugzilla
  Reports 25687 and 26225.

* <java> ignored the append attribute, Bugzilla Report 26137.

* The gcj compiler adapter for <javac> failed if the destination
  directory didn't exist.  Bugzilla Report 25856.

* Ant now fails with a more useful message if a new process will be
  forked in a directory and that directory doesn't exist.

* <splash> used to break the build on non-GUI environments.  Bugzilla
  report 11482.

* Ant 1.6.0 cannot run build scripts in directories with non-ASCII names.
  Bugzilla Report 26642.

Other changes:
--------------
* Shipped XML parser is now Xerces-J 2.6.1

* Translate task logs a debug message specifying the number of files
  that it processed.  Bugzilla Report 13938.

* <fixcrlf> has a new attribute - fixlast. Bugzilla Report 23262.

* <p4submit> has 2 new attributes, needsresolveproperty and changeproperty.
  Bugzilla Report 25711.

* add description attributes to macrodef attributes and elements.
  Bugzilla Report 24711.

* Extending ClearCase Tasks :
 - Added an extra option to 'failonerr' to each ClearCase task/command.
 - Extended the functionality of cccheckout. It can check (notco) to see if
  the desired element is already checked out to the current view. Thus it
   won't attempt to check it out again.
 - Added three new ClearCase commands: ccmkattr, ccmkdir, ccmkelem
  Bugzilla Report 26253.

* added nested text support to <macrodef>

* added initial support for Java 1.5.  Java 1.5 is now correctly
  detected by Ant and treated just like Java 1.4.  You can now specify
  source="1.5" in the <javac> task.

* created new task <cvsversion>

* added support for branch logging via the tag attribute in <cvschangelog>
  Bugzilla Report 13510.

* added support the groovy language in the script and scriptdef tasks

Changes from Ant 1.5.4 to Ant 1.6.0
===================================

Changes that could break older environments:
--------------------------------------------

* This version of Ant can not be built with JDK 1.1 and requires at
  least Java 1.2 at runtime as well.  Compiling for a 1.1 target is
  still supported.

* Targets cannot have the empty string as their name any longer.

* ant.jar's manifest does no longer include a Class-Path entry, so it
  is no longer possible to run Ant via "java -jar ant.jar" without
  manually altering the CLASSPATH.  Instead of that a file
  ant-bootstrap.jar is included in the etc directory of the binary
  distribution, copy this to the lib directory and use
  "java -jar ant-bootstrap.jar" instead if you want to run Ant without
  the wrapper script (not recommended).

* The <script> task now requires Apache BSF instead of the older IBM
  version.  See <http://jakarta.apache.org/bsf/>

* <xmlproperty> will no longer fail if the file to be loaded doesn't exist.

* XML namespaces are now enabled in the XML parser, meaning XML namespace
  declarations no longer cause errors. However task names containing colons
  will cause errors unless there is a corresponding namespace uri.

* The <ftp> and <telnet> tasks now require Jakarta Commons Net instead
  of the older ORO Netcomponents version.  See
  <http://jakarta.apache.org/commons/net/index.html>.

* <input> will no longer prompt the user and wait for input if the
  addproperty attribute is set to a property that has already been
  defined in the project.  If you rely on the task waiting for input,
  don't use the addproperty attribute.

* The Class-Path attribute in manifests will no longer merge the
  entries of all manifests found, but will be treated like all other
  manifest attributes - the most recent attribute(s) will be used.

* New Launch mechanism implemented. This moves some functionality from
  the batch files / shell scripts into Java. This removes environment
  limitations, for command issues, directory depth issues on Windows. Also
  allows a per-user library location to be used if the main Ant install
  is locked down.

* The Entry nested element of PropertyFile will not any more have its value
  attribute (actually increment) overwritten with the new value of the entry
  after execution.

* Output stored from a <java> or <exec> task is now exactly as generated. No
  conversion to platform end-of-line characters is performed.

* <translate> will now preserve line endings.

* <ftp> followsymlinks="false" in nested fileset definitions is explicitly
  required in order to exclude remote symbolic links (when doing a get, chmod,
  delete, rmdir).

* The values of the Copy#fileCopyMap variable has changed from String to
  String[]. (In java 1.5 terms it was Hashtable<String, String> and
  is now Hashtable<String, String[]>). This will affect third party code
  that extend Copy and override Copy#doFileOperations.

* <loadproperties> didn't expand properties while <property file="..."/>
  does, so they were not equivalent.  This has been fixed, which means
  that propetries may get expanded twice if you use an
  <expandproperties> filterreader.  Bugzilla Report 17782.

* User defined tasks and typedefs are now handled internally in the
  same way as predefined tasks and typedefs. Also tasks and typedefs
  are resolved at a later stage. This causes some
  differences especially for user defined task containers.

* <checksum> log message "Calculating checksum ..." has been degraded
  from INFO to VERBOSE.

Fixed bugs:
-----------
* Filter readers were not handling line endings properly.  Bugzilla
  Report 18476.

* Filtersets were also not handling line endings properly.

* Expand tasks did not behave as expected with PatternSets.

* <property environment=... /> now works on OS/400.

* <cab> could hang listcab on large <fileset>s.

* The starteam stcheckout, stcheckin tasks now correctly compute
  status of files against whatever local tree they are run against
  and, optionally, will not process a file if it is current.
  Previously you had to process everything unless you ran against the
  default folder which wasn't the normal use-case for ant-starteam.
  The stlist task now similarly displays that status correctly making
  it a more generally useful tool.

* entity includes would cause exceptions if path names included spaces.

* addConfiguredXXX would not work for TaskAdapter wrapped tasks

* Fix <ilasm> outputfile testing so that the output file does not need
  to exist beforehand.

* Ant will now exit with a return code of 1 if it encounters problems
  with the command line arguments.

* ClassLoader creation changes to use a factory method in Project. A new
  class AntClassLoader2 implemented for 1.2+ specific features including
  Package information and addition of classes specified in the Class-Path
  element of a Jar's manifest.

* It is now possible in <exec> to resolve the executable to a project
  basedir or execution dir relative executable. The resolveExecutable
  must be used to pick up such executables.

* splash screen wouldn't disappear when build was finished.

* <exec> output and error streams can now be redirected independently
  to either a property or a file (or both)

* TarEntry's File-arg constructor would fail with a
  StringIndexOutOfBoundsException on all OSes where os.name is shorter
  than seven characters.  Bugzilla Report 18105.

* <copy> and <move>'s failonerror didn't apply to filesets pointing to
  non-existent directories.  Bugzilla Report 18414.

* The <stripjavacomments> filter sometimes removed parts of string
  constants.  Bugzilla Report 17441.

* <antlr> will now recompile your grammar if the supergrammar has
  changed.  Bugzilla Report 12691.

* <property env> will now work on Unices with /bin/env instead of
  /usr/bin/env.  Bugzilla Report 17642.

* <jar index="on"> could include multiple index lists.  Bugzilla 10262.

* The index created by <jar> didn't conform to the spec as it didn't
  include the top-level entries.  Bugzilla Report 16972.

* <tar> and <zip> didn't honor the defaultexcludes attribute for the
  implicit fileset.  Bugzilla Report 18637.

* The <replacetokens> filter would throw an exception if the token's
  value was an empty string.  Bugzilla Report 18625.

* Perforce tasks relying on output from the server such as <p4change>
  and <p4label> were hanging. Bugzilla Reports 18129 and 18956.

* Improve exception and logging behavior of Perforce tasks.
  Bugzilla report 18154.

* build.sh install had a problem on cygwin (with REALANTHOME).
  Bugzilla Report 17257

* <replaceregexp> didn't work for multi-byte encodings if byline was false.
  Bugzilla Report 19187.

* <replaceregexp> was altering unnecessarily the timestamp of the directories
  containing the files to process
  Bugzilla Report 22541.

* file names that include spaces need to be quoted inside the @argfile
  argument using forked <javac> and (all JDKS).  Bugzilla Report 10499.
  NB : a first correction was only introducing quotes for JDK 1.4
  It has been changed to quote for all external compilers when paths
  contain spaces.
  Also the backslashes need to be converted to forward slashes
  Bugzilla Report 17683.

* Setting filesonly to true in <zip> and related tasks would cause the
  archives to be always recreated.  Bugzilla Report 19449.

* file names that include spaces need to be quoted inside the @argfile
  argument using <javadoc> and JDK 1.4.  Bugzilla Report 16871.

* <junit> didn't work with custom formatters that were only available
  on the user specified classpath when a timeout occurred.  Bugzilla
  Report 19953.

* <different> selector : make ignoreFileTimes effectively default to true
  and fix a bug in the comparison of timestamps. Bugzilla Report 20205.

* <different> selector can now be nested directly under a fileset
  Bugzilla Report 20220.

* <cvstagdiff> had a problem with "dd-MM-yy hh:mm:ss" formats
  Bugzilla Report 15995.

* <cvstagdiff> cvsroot and package attributes added to the root
  element tagdiff of the xml output
  Bugzilla Report 16081.

* <cvstagdiff> had a problem with aliased modules and with requests for
  multiple modules. Bugzilla Reports 21373 and 22877.

* <cvstagdiff> could not parse properly the revision number of new files with
  CVS 1.11.9 or higher. Bugzilla Report 24406.

* <fixcrlf> make fixcrlf create its temporary files in the default directory
  of FileUtils#createTempFile instead of the destination dir of fixcrlf.
  Bugzilla Report 20870.

* <ejbjar> implementation for Borland.
  Prevent the task from being blocked by error messages coming from java2iiop.
  Bugzilla Report 19385.

* <unzip>'s and <untar>'s nested patternsets didn't work as documented
  when the pattern ended in a slash or backslash.  Bugzilla Report 20969.

* <fixcrlf> will now create the parent directories for the destination
  files if necessary.  Bugzilla Report 20840.

* <xmlproperty> now handles CDATA sections. BugZilla Report 17195

* <translate> now translate tokens that are placed close together.
  Bugzilla Report 17297

* Nested websphere element for ejbjar does not support spaces in file name.
  Bugzilla Report 21298

* Don't multiply Class-Path attributes when updating jars.  Bugzilla
  Report 21170.

* Do not overwrite the value (increment) attribute of PropertyFile nested
  Entry element. Bugzilla Report 21505.

* Prevent sysproperties with no key or no value from being added in <junit>.
  Bugzilla Report 21684.

* Allow references to be properly inherited via antcall
  Bugzilla Report 21724.

* ftp chmod failed when the remote system was UNIX and local system Windows
  Bugzilla Report 21865.

* ftp put with chmod failed when the remote system was UNIX and local system
  Windows. Bugzilla Report 23143.

* ftp did not set the ascii mode explicitly, causing problems with ftp servers
  having binary as default

* ftp was not able to download files when they were pointed to by symbolic
  links. Bugzilla Report 14063.

* ftp is able to download also directories pointed to by symbolic links.

* replace would change \r\n into \r\r\n under Windows.

* junitreport with frames did not display a link for classes without a package
  or in the top package.
  Bugzilla Report 21915.

* Project.toBoolean(String) now handles null as argument and does not throw a
  NullPointerException any more.

* The socket condition will now close the socket created to test.
  Bugzilla Report 23040.

* <junit includeantruntime="true" fork="true"> replaced the CLASSPATH instead
  of adding to it.  Bugzilla Report 14971.

* <splash> could fail on JVMs that use null to indicate the system classloader.
  Bugzilla Report 23320.

* <xmlcatalog>s only worked when defined inside of tasks.  Bugzilla
  Report 20965.

* <csc> and siblings (<vbc> <jsharpc>) handle large filesets by
automatic use of response files.  Bugzilla report #19630

Other changes:
--------------

* Shipped XML parser is now Xerces 2.6.0

* All tasks can be used outside of <target>s.  Note that some tasks
  will not work at all outside of targets as they would cause infinite
  loops (<antcall> as well as <ant> and <subant> if they invoke the
  current build file).

* Six new Clearcase tasks added.

* A new filter reader namely tokenfilter has been added.  Bugzilla
  Report 18312.

* A new attribute named skip is added to the TailFilter and
  HeadFilter filter readers.

* The filesetmanifest attribute of <jar> has been reenabled.

* The start and end tokens for <translate> may now be longer than a
  single character.

* <setproxy> lets you set the username and password for proxies that
  want authentication

* <loadproperties> has a new encoding attribute.

* <echoproperties> can now create XML output.

* <echoproperties> has a new srcfile attribute that can make it read
  properties files and output them instead of Ant's properties.

* <filterset> will now resolve filters recursively.

* <input> has a new attribute that allows you to specify a default value.

* Added <image> task (requires JAI).

* <image> task has now proportions attribute in the <scale/> nested element
  instead of keepproportions (bringing in more functionality)

* New condition <isreference>

* <ftp> now has a preservelastmodified attribute to preserve the
  timestamp of a downloaded file.

* new rmdir action for <ftp> that removes directories from a fileset.

* <ftp> has attributes timediffauto and timediffmillis to use together
  with the newer attribute to tell ant to take into account a time difference
  between client and remote side.
  Bugzilla Report 19358.

* <ftp> has been optimized to go directly to the include patterns.
  This reduces scanning time under UNIX when followsymlinks="true"
  and casesensitive="true" (the default)
  Bugzilla Report 20103.

* The SOS and VSS tasks will no longer unconditionally prepend a $ to
  vsspath or projectpath.

* OS/400 now gets detected by the os condition.

* <arg> has a new attribute pathref that can be used to reference
  previously defined paths.

* <xmlproperty> has been improved, you can now expand ${properties},
  define ids or paths and use Ant's location magic for filename resolutions
  in the XML file.

* <xmlcatalog> will now support external catalogs according to the
  OASIS "Open Catalog" standard - if resolver.jar (newer than version
  1.0) from Apache's xml-commons is in your CLASSPATH.

* Starteam tasks now have support for revision labels and build labels.
  Checkouts now have the option of using repository timestamps, instead
  of current.

* new task <symlink> that creates and maintains symbolic links.

* new tasks <chown> and <chgrp> which are wrappers of the Unix commands.

* new task <attrib> to change file attributes on Windows systems.

* <style> has a new attribute reloadstylesheet to work around a
  bug in widespread Xalan versions.

* <tarfileset> has a new dirmode attribute to specify the permissions
  for directories.

* <fixcrlf>'s eol attribute now also understands "mac", "unix" and "dos".

* <classfileset> now picks up dependencies of the form MyClass.class. This
  works for the code generated by the Sun java compiler. It may not work for
  all compilers.

* a new attribute "globalopts" can be added to all Perforce tasks.
  You can put in it all the strings described by p4 help usage. Refer to
  the docs for more information.

* new Perforce tasks <p4integrate> , <p4resolve>, and <p4labelsync>

* <p4submit> will change the property p4.change if the Perforce server
  renumbers the change list.
  It will set the property p4.needsresolve if the submit fails,
  and the message says that file(s) need to be resolved.

* <replaceregexp> now has an optional encoding attribute to support
  replacing in files that are in a different encoding than the
  platform's default.

* The <exec> task may now have its input redirected from either a file
  or a string from the build file. The error output can be separated
  to a different file when outut is redirected. standard error may be
  logged to the Ant log when redirecting output to a file

* The <java> task also supports the input redirection and separate
  error streams introduced to the <exec> task. In addition, it is now
  possible to save the output into a property for use within the build
  file as was possible with <exec> in Ant 1.5

* The <javadoc> task <tag> subelement has been enhanced to allow files
  with tag mappings to be used.

* New tasks: <scp> supports file transfers, <sshexec> executes a
  command over SSH.  They require jsch, a BSD licensed SSH library that
  can be found at http://www.jcraft.com/jsch/index.html

* New filterreader <escapeunicode/>.

* Support for HP's NonStop Kernel (Tandem) OS has been added.

* <cab>'s basedir attribute is now optional if you specify nested
  filesets.  Bugzilla Report 18046.

* New task <sync> that synchronizes two directory trees.

* <apply> has new forwardslash attribute that can force filenames to
  use forward slashes (/) as file separators even on platforms with a
  different separator.  This is useful if you want to run certain
  ported Unix tools.

* Copy has a new outputencoding attribute that can be used to change
  the encoding while copying files.  Bugzilla Report 18217.

* The xml formatter for JUnit will now honor test case names set with
  setName.  Bugzilla Report 17040.

* JUnit now has an attribute reloading, which, when set to false,
  makes the task reuse the same class loader for a series of tests.

* <concat> now supports filtering and can check timestamps before
  overriding a file.  Bugzilla Report 18166.

* <junit> has a new attribute tempdir that controls the placement of
  temporary files.  Bugzilla Report 15454.

* <jdepend> now supports a new nested element <classespath> which is
  the same as <sourcespath> but point to compiled classes (the
  preferred mode of operation for JDepend > 2.5).  Additionally, nested
  <exclude> elements can be used to exclude certain packages from
  being parsed.  Bugzilla Report 17134.

* The JProbe tasks now also work with JProbe 4.x.  Bugzilla Report 14849.

* <javacc> and <jjtree> will now autodetect JavaCC 3.x and can use it.

* <sql> has a new attribute to control escape processing.

* <sql> is able to display properly several resultsets if you are
  running a compound sql statement. Bugzilla Report 21594.

* A new <containsregexp> selector has been added, that selects files
  if their content matches a certain regular expression.

* <antlr>'s debug attribute has been enabled.  Bugzilla Report 19051.

* <mail> has a new attribute charset. Bugzilla Report 15434.

* <mail> has new attributes user and password for SMTP auth.
  maillogger can also use this.
  The implementation only works with JavaMail (encoding="MIME").
  Implementation with plain mail remains to do.
  Bugzilla Report 5969.

* <mail> and mailloger support SMTP over TLS/SSL
  Bugzilla Report 19180.

* <mail> the attributes from, replyto ,tolist, cclist, bcclist
  can now contain email addresses of the form name <address@xyz.com>
  or (name) address@xyz.com
  Bugzilla Report 22474.

* <mail> (version PlainMail)
  prevent blank headers from being sent,
  make the order of the headers of plain mail messages predictable
  Bugzilla Report 22088.

* <zipfileset> can now be defined in the main body of a project
  and referred to with refid="xyz". Bugzilla Report 17007.

* A wrapper script for OS/2 has been added.

* <unzip> will now detect and successfully extract self-extracting
  archives.  Bugzilla Report 16213.

* <stcheckout> has a new attribute "converteol" that can be used to
  control the automatic line-end conversion performed on ASCII files.
  Bugzilla Report 18884.

* Users can now modify the list of default excludes using the new
  defaultexcludes task.  Bugzilla Report 12700.

* There is a new data type <propertyset> that can be used to collect
  properties.  It is supported by <ant>, <antcall>, <subant>, <java>,
  <echoproperties> and <junit>.

* <concat> can now control the encoding of the output as well and optionally
  add new-line characters at the end of files that get concatenated but
  don't end in newlines.  Bugzilla Report 12511.

* <rpm> will detect the rpmbuild executable of RedHat 8.0 and newer
  and use that if it is on your PATH.  Bugzilla Report 14650.

* A new task <rexec> has been added that requires commons-net to work.
  Bugzilla Report 19541.

* <javadoc> now supports a nested <arg> element in addition to the
  additionalparams attribute.

* You can now determine the order of standard tags in <javadoc> via
  <tag> elements - you must not use the description attribute for them.
  Bugzilla Report 18912.

* <javadoc> now supports the -noqualifier switch.  Bugzilla Report 19288.

* <javac>'s executable attribute can now also be used to specify the
  executable for jikes, jvc, sj or gcj.  Bugzilla Report 13814.

* <javac> has a new attribute tempdir that can control the placement
  of temporary files.  Bugzilla Report 19765.

* A new magic property build.compiler.jvc.extensions has been added
  that can be used to turn of Microsoft extensions while using the jvc
  compiler.  Bugzilla Report 19826.

* You can now limit the parallelism of <apply> and <chmod> by using the new
  maxparallel attribute.

* With the new addsourcefile attribute, you can make <apply> ommit the
  source file names from the command line.  Bugzilla Report 13654.

* <apply> and <chmod> now support nested <filelist>s as well as <dirset>s.
  Bugzilla Reports 15929 and 20687.

* <apply> and <chmod> will display a summary if you set the new
  verbose attribute to true.  Bugzilla Report 19883.

* <copy>/<move>'s failonerror attribute can now also be used to
  continue the build if an I/O error caused a problem.  Bugzilla
  Report 12999.

* new selector <type/> allowing to select only files or only directories.
  Bugzilla Report 20222.

* <java> and <junit> now support a nested <bootclasspath> element that
  will be ignored if not forking a new VM.

* <junit>'s nested <formatter> elements now support if/unless clauses.

* <ejbjar>
  cmpversion attribute added
  jboss element will look for jbosscmp-jdbc.xml descriptor
  if ejbjar has cmpversion="2.0" set
  Bugzilla Reports 14707 and 14709.

* <pvcs> config attribute added to set the location of a specific PVCS
  .cfg file
  Bugzilla Report 9752

* <mapper> has an "unpackage" mapper
  Bugzilla Report 18908

* Added <scriptdef> task allowing tasks to be defined using any BSF-supported
  scripting language.

* <touch>'s datetime attribute can now accept time with a granularity
  of seconds as well.  Bugzilla Report 21014.

* <checksum> has two new properties: totalproperty and todir.

* FileUtils#createTempFile will now create temporary files in the
  directory pointed to by the property java.io.tmpdir

* <unzip> and friends now supports an optional encoding attribute to
  enable it to expand archives created with filenames using an encoding
  other than UTF8.  Bugzilla Report 10504.

* <patch> has a new attribute destfile that can be used to create a new
  file instead of patching files in place.

* OpenVMS is detected as a valid OS family.

* DirectoryScanner has been optimized for cases where include patterns do not
  start with wildcards.  Bugzilla Report 20103.

* DirectoryScanner begins to be optimized not to scan excluded directories.
  Bugzilla Report 21941.

* Added keep-going feature. Bugzilla Report 21144

* The archives generated by <zip> and friends will now contain CRC and
  size information in the "local file header", thereby providing this
  information to applications that read the archives using
  java.util.ZipInputStream.  Bugzilla Report 19195.

* <copy> and <move> can now handle mappers that return multiple
  mappings per source path. This behaviour is enabled by using
  an enablemultiplemapping attribute. Bugzilla Report 21320.

* <exec> will now work on OpenVMS (please read the notes in
  <exec>'s manual page).  Bugzilla Report 21877.

* <exec> will now have a new attribute spawn (default false).
  If set to true, the process will be spawned. Bugzilla Report 5907.

* <java> will now have a new attribute spawn (default false).
  If set to true, the process will be spawned. Bugzilla Report 5907.

* <parallel> now supports a timeout which can be used to recover
  from deadlocks, etc in the parallel threads. <parallel> also
  now supports a <daemons> nested element. This can be used to
  run tasks in daemon threads which the parallel task will not
  wait for before completing. A new attribute failonany will cause
  <parallel> to throw an exception if any thread fails without
  waiting for all other threads to complete.

* <zip> and friends will consume far less memory than they used to
  when run with compress="false".  Bugzilla Report 21899.

* <if/> and <unless/> attributes added to <param/> element of <style>
   Bugzilla Report 22044

* <zip> and friends have a new attribute "keepcompression" that can be
  used to incrementally build an archive mixing compressed and uncompressed
  entries.

* <junit>'s XML formatter adds a new classname attribute to the <testcase>
  elements.

* new <permissions> type add permission handling to the code
  this type can be nested in the <java> and <junit> tasks.
  Bugzilla Report 22533.

* additional shortcuts for ant options (-d --> -debug, -e --> -emacs,
  -h --> -help, -p --> -projecthelp, -s --> -find).

* new selector <modified>. "cache" was renamed to "modified".
  Bugzilla Report 20474.

* <stcheckout> and <stlist> have a new asofdate attribute that can be
  used to checkout/list files based on a date instead of a label.
  Bugzilla Report 20578.

* New filter <concatfilter>. Adds the content of file at the beginning
  or end of a file. Discussion started at
  http://marc.theaimsgroup.com/?l=ant-user&m=106366791228585&w=2

* New task <import>

* New task <macrodef>

* New task <presetdef>

* Ant libraries that can make use of namespaces to avoid name
  clashes of custom tasks

* <java> and <junit> now support <assertions>, which let you enable
  and disable Java1.4 assertions on a package or class basis. These
  only work when fork=true, currently.

* .NET tasks expanded with VB support <vbc> and J#, via <jsharp>,
  <importtypelib> and <ilasm>. <csc> supports nested <src> types,
  <defines> for (potentially conditional) definitions, <reference>
  filesets for references. The executable attribute lets you switch to
  mono or other implementations -<csc> has been tested with Mono on
  Linux and OSX.


Changes from Ant 1.5.3 to Ant 1.5.4
===================================

Changes that could break older environments:
--------------------------------------------

* If the Visual Age tasks used to work for you, they may stop doing so
  now - and we'd like to know about it.  The current set of tasks is
  supposed to work with any version of VAJ starting with 3.0.

Fixed bugs:
-----------

* The Visual Age for Java tasks didn't work (at least for versions 3.0
  and higher).  Bugzilla Report 10016.

* URL-encoding in <vaj*port> didn't work properly.

* VAJRemoteUtil called getAbsolutePath instead of getPath
  causing problems when using a Windows VAJ server from a UNIX server.
  Bugzilla Report 20457.

* VAJImport task failed with NullPointerException when using DirectoryScanner.
  Bugzilla Report 22080.

Other changes:
--------------

* Shipped XML parser is now Xerces 2.5.0

* <javah> will invoke oldjavah on JDK 1.4.2.  Bugzilla Report 18667.

* The VAJ tasks now support a haltonfailure attribute to conditionally
  keep building even if they fail.

* It is now possible to use the latest (versioned or unversioned) edition
  in <vajload> by using special wildcard characters.  Also fixes
  Bugzilla Report 2236.

Changes from Ant 1.5.2 to Ant 1.5.3
===================================

Changes that could break older environments:
--------------------------------------------

* The <zip> task and friends have again changed a method signature
  (sorry, was necessary to fix bug 17780).  The return type of
  getResourcesToAdd has changed.

Fixed bugs:
-----------

* <zipfileset>'s filemode would get ignored and the dirmode was used
  for the included files as well.  As a side effect, WinZIP was unable
  to extract or display the files, so they seemed to be missing from
  the archive.  Bugzilla Report 17648.

* <ftp> could use the wrong path separator when trying to change the
  remote working directory.  Bugzilla Report 17735.

* <jar update="true"> would loose all original files if you didn't
  specify any nested <(zip)fileset>s and the manifest had changed.
  Bugzilla Report 17780.

* If you used a value starting with \ on Windows for the appxml
  attribute of <ear> or the webxml attribute of <war>, it would be
  ignored.  Bugzilla Report 17871.

* Ant will no longer implicitly add Sun's rt.jar in <javac> when you
  use jvc and don't specify a bootclasspath.  Bugzilla Report 18055.

* The prefix attribute of <zipfileset> would not generate directory
  entries for the prefix itself.  Bugzilla Report 18403.

* starteam checkout can now handle deleted labels.  Bugzilla Report 17646.

* The Unix wrapper script failed if you invoked it as a relative
  symlink and ANT_HOME has not been set.  Bugzilla Report 17721.

Other Changes:
--------------
* Added ability to specify manifest encoding for the <jar> and
  <manifest> tasks

Changes from Ant 1.5.1 to Ant 1.5.2
=============================================

Changes that could break older environments:
--------------------------------------------
* ANT_OPTS environment variable is now applied at the start of the
  Java command line, allowing position specific parameters of some
  JVMs, such as -classic to be specified.

* ZipScanner#getIncludedFiles will now return the names of the ZipEntries
  that have been matched instead of the name of the archive.

* The <zip> task and friends have been heavily modified, almost every
  method signature of the Zip class has changed.  If you have subclassed
  Zip (or one of its subclasses), your class will most likely not
  compile against the current code base.  If it still compiles, it will
  probably not work as in Ant 1.5.1.

Fixed bugs:
-----------
* <translate> was not ignoring comment lines.

* <manifest> wouldn't update an existing manifest if only an attribute
  of an existing section changed.

* ant.bat now supports the ANT_ARGS and JAVACMD environment variables
  again (like Ant 1.5 did).

* The "plain" <junit> <formatter> could throw a NullPointerException
  if an error occurred in setUp.

* <junit> will now produce output when a test times out as well.

* <replace> would count some internal character replacements when
  reporting the number of replaced tokens.

* <concat> would cause an exception if a <filelist> pointed to files
  that do not exist.

* <javadoc> will now pass -source to custom doclets as well.

* <cvstagdiff> would throw a NullPointException if there had been no
  differences.

* <cvschangelog> could miss today's changes.

* <concat> could append newline characters between concatenated files.

* <xmlvalidate> ignored the specified encoding of the files to
  validate.

* the errorsbeginat attribute of the <http> condition didn't work.

* Ant will try to force loading of certain packages like com.sun.*
  from the system classloader.  The packages are determined by the
  version of the JVM running Ant.

* Ant didn't find the runtime libraries on IBM's JDK 1.4 for Linux.

* random component of temporary files is now always a positive integer.

* Ant could incorrectly try to use the 1.4 regexp implementation even
  if it isn't available if you run the JVM with -Xverify:none.

* Ant would die with an exception if you used nested <reference>
  elements in Ant and the refid attribute didn't point to an existing
  project reference.

* The <get> task can now be compiled (and Ant thus bootstrapped) using
  Kaffee.

* build.sysclasspath will now be honored by more tasks.

* The signjar keystore attribute has been reverted to a String allowing
  it to once again accept URLs. This should not affect current File based usage
  unless you are extending the Signjar task.

* <jar update="true"> would remove the original manifest.

* fix up folder creation in PVCS task

* <tar>'s up-to-date check didn't work for nested <(tar)fileset>s.

* Corrected a problem in XMLLogger where it would not associated
  messages with a taskdef'd task

* <uptodate> now works when using attributes (i.e. not filesets) and pointing
  to the same file

* Java task (and output system) now stores output which doos not end
  with a line feed.

* splash screen wouldn't disappear when build was finished.

* <exec> now supports OS/2.

* <zip> and friends would only update/recreate existing archives if
  the files to add/update have been newer than the archive.

* <javadoc>'s <link> element could fail for offline="true" on some JDKs.

Other changes:
--------------

* MailLogger now sets the Date header correctly.

* Shipped XML parser is now Xerces 2.3.0

* signjar now accepts a maxmemory attribute to allow the memory allocated to the
  jarsigner tool to be specified. The jarsigner from the JDK's JAVA_HOME bin
  dir is now used rather than the first jarsigner on the path.

* **/.DS_Store has been added to the list of default pattern excludes.

* The Created-By header in the default manifest now contains the JVM
  vendor and version according to the jar specification. A new header,
  Ant-Version provides the Ant version used to create the jar.

* <zip> can now store Unix permissions in a way that can be
  reconstructed by Info-Zip's unzip command.

Changes from Ant 1.5.1Beta1 to 1.5.1
====================================

Fixed bugs:
-----------

* <tstamp>'s prefix attribute failed to apply to nested <format> elements.

* <junitreport> created an empty junit-noframes.html if no format had
  been specified.

* <basename> would remove more than it should if the file name
  contained more than one dot.

* <filterset>s nested into <filterset>s didn't work.

Other changes:
--------------

* Shipped XML parser is now Xerces 2.2.0

* Filesets now support a 'file' attribute, allowing a single-file
  fileset to be constructed without having to specify its parent
  directory separately.

* <junit> will now return the result of a call to getName instead of
  "unknown" for Test implementations that don't extend TestCase but have
  a public String getName() method.

Changes from Ant 1.5 to 1.5.1Beta1
==================================

Fixed bugs:
-----------
* Date/time in CvsChangeLog was in local timezone and 12 hour format leading
  to a problem when sorting by time. It is now UTC (GMT) and in 24-hour
  format as per cvs 'specifications'.

* CvsTagDiff now supports ampersand modules or modules that have a different
  root directory than their name.

* EjbJar threw NPEs for the Websphere element. The property 'websphere.home'
  was not documented.

* Mail example in the documentation was not correct.

* Checksum was broken in the following scenario:
  (using verifyproperty OR in a condition) AND using filesets
  with multiple files.

* The ExpandProperties filter threw NPEs when defined using
  the <filterreader> format.

* The sh wrapper script didn't work under Cygwin if ANT_HOME wasn't
  set with a Unix style filename.

* The sh wrapper script could fail if you started Ant from a directory
  with whitespace in its name.

* ant -diagnostics was not working properly when the task dependency
  was missing and was just printing the missing dependency.

* If a task got redefined via <taskdef>, it lost its child elements.

* <property>'s classpathref attribute was broken.

* <arg line="''" /> would result in no command line argument, will now
  be a single empty argument.  Use <arg value="''"/> if you need the
  quotes literally.

* <replaceregexp> could append a newline character at the end of the
  file.

Other changes:
--------------

* Appendix E of Java Development with Ant (Loughran/Hatcher) was
  contributed to the docs.

* <available> will only print deprecration warnings if it is actually
  used to change the value of a property.

Changes from Ant 1.5beta3 to Ant 1.5
====================================

Changes that could break older environments:
--------------------------------------------

* The filesetmanifest attribute added to <jar> after the 1.4.1
  release has been removed for now.  This change may affect only
  the 1.5Beta/1.6Alpha users.  An attempt will be made to add this
  feature back into Ant 1.6.

Fixed bugs:
-----------

* <zip> and friends would always update existing archive if you set
  the update attribute to true.

* To support backward compatibility with older versions, <pathconvert>
  will once again set the property, even if the result is the empty
  string, unless the new 'setonempty' attribute is set to false|no|off
  (default is "true").

* The manifest task would crash XmlLogger

Other changes:
--------------

* added **/.svn and **/.svn/** to the default excludes

Changes from Ant 1.5beta2 to Ant 1.5beta3
=========================================

Changes that could break older environments:
--------------------------------------------

* <pvcs> default filenameformat has been different from Ant 1.4.1.
  Now it is different from 1.5beta1 and 1.5beta2.

* <pathconvert> won't set the property if the result is the empty string.

Fixed bugs:
-----------

* <available> could fail to find files or directories that happen to
  start with the name of the project's basedir but are not children of
  the basedir.

* Nested <property>'s inside <ant> can now be overriden by subsequent
  <ant> and <antcall> tasks.

* <xslt>'s outputtype attribute wouldn't do anything.

* <linecontains> filterreader could swallow lines.

* <sequential> used to configure the tasks (set their attributes)
  before the first task has been executed.  This means that properties
  that have been set by nested task seemed to be unset for the other
  tasks in the same <sequential> element.

* <javac>'s sourcepath setting has been ignored by some compiler
  implementations.

* <javadoc>'s packagelist attribute didn't work.

* the plain mailer would always use port 25 in <mail>.

* Ant's default logger could swallow empty lines.

* ejbjar's iPlanet nested element now can process multiple descriptors.

* IPlanetEjbc was looking in the wrong place for four iiop files.

* <javac> would pass the -source switch to JDK 1.3's javac, even
  though it doesn't support it.

Other changes:
--------------

* <checksum> now uses a buffer (of configurable size).

* The "Trying to override task definition" warning has been degraded
  to verbose level if the two task definitions only differ in the class
  loader instance that has loaded the definition.

* Add a jvmargs to the ejbjar's weblogic element to allow additional
  arguments to be provided to the VM runnign ejbc. Document the
  jvmdebuglevel attribute which can be used to avoid warnings about
  interface classess being found on the classpath. Document the new
  <sysproperty> element which allows JVM properties to be defined.
  Added an outputdir attribute to allow the destination to be a
  directory into which the exploded jar is written.

* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5

Changes from Ant 1.5beta1 to Ant 1.5beta2
=========================================

Changes that could break older environments:
--------------------------------------------

* Properties will now be expanded in mail message bodies.  This means
  that one $ sign will be stripped if your mail message contains the text $$.

* org.apache.tools.ant.taskdefs.Expand no longer extends MatchingTask.

* Available#setFile now again uses a File argument as it did in 1.4,
  this may break environments that have been adapted to the String
  argument version present in 1.5beta1.

Fixed bugs:
-----------
* When <move> attempts a rename, it deletes the destination file, if it
  exists, before renaming the source file.  However, <move> was not
  checking if the destination file was actually a directory before
  trying to delete it.

* Make CVS Tasks to work under Cygwin.

* Fix LineContains to handle huge files elegantly without causing
  Stack Overflows.

* if you ask for the "classic" compiler on Java1.4, you get upgraded to
  "modern" because there is no classic compiler any more.

* the <http> condition was viewing 404 'not found' exceptions as success. Now
  it defaults to viewing any response >=400 as an error, and has an
  errorsBeginAt attribute you can use if you want a higher or lower value.

* <get> throws a build exception on an http authorization error, unless you
  have set ignoreerrors to true.

* <wsdltodotnet> was spelt in Wintel case: <WsdlToDotnet>. It is now lower
  case, though the old spelling is retained for anyone who used it.

* Merging of Manifests in jar now works as documented.

* paths that have been separated by colons would be incorrectly parsed
  on NetWare.

* runant.pl now supports NetWare.

* <tempfile> and <setproxy> tasks were in beta1, but not defined by
  default; They now are. <tempfile> fills a property with the name of a
  temporary file; <setproxy> lets you set the JVM's http, ftp and socks proxy
  settings.

* <available classname="foo" ignoresystemclasses="true"> failed for
  JDK 1.1 and 1.2, even if the class could be found on the
  user-specified classpath.

* <property environment=... /> now works on z/OS.

* forked <javac> failed for the wrong reason on JDK 1.1 - Ant would
  use a temporary file to hold the names of the files to compile under
  some conditons, but 1.1 doesn't support this feature.  Ant will no
  longer try this, but you may run into problems with the length of the
  command line now.

* the refid attribute for <property>s nested into <ant> or <param>s
  nested into <antcall> didn't work.

* <replaceregexp> didn't work for nested <fileset>s.

* <javadoc> dropped sourcepath entries if no "interesting" .java
  source files  could be found below them.  This has been backwards
  incompatible and caused problems with custom doclets like xdoclet.

* Using the doclet, docletpath or docletpathref attributes of
  <javadoc> may have caused NullPointerExceptions.

* nested <filesets> of <javadoc> would include too much.

* <dependset> will no longer choke on <targetfileset>s that point to
  non-existing directories.

* <patch> didn't work at all.

* <replace> and <replaceregexp> now fail if the file they are working
  on is locked.

* <javadoc> would pick up the wrong executable in the combination JDK
  1.2 and AIX.

Other changes:
--------------

* z/OS now gets detected by the os condition.

* <fileset> and <dirset> now have an optional followsymlink attribute
  that can prevent Ant from following symbolic links on some platforms.

* BeanShell is now supported in the <script> task.

* <ejbjar> under Weblogic attempts to use the ejbc20 compiler for 2.0 beans
  based on the deployment descriptor's DTD reference. Under weblogic 7.00 Beta
  this ejbc class has been deprecated. To avoid the deprecation warning use
  ejbcclass="weblogic.ejbc".

* <ejbjar> will add a manifest to the generated jar based on the naming
  convention in use. This overrides the manifest specified in the
  <ejbjar> attribute


Changes from Ant 1.4.1 to 1.5beta1
==================================

Changes that could break older environments:
--------------------------------------------

* Important: Single $ signs are no longer silently stripped!
  Before you panic that we have broken all your build files, we have kept
  the old "$$" -> "$" behaviour. So only build files which accidentally had
  a $ sign in a string that was being silently stripped may break.
  We added this fix to stop newbie confusion; if you want to write a
  build file which works on ant versions 1.4.1 or earlier, stay with
  the double $$ sign rule.

* Project.getBuildListeners now returns a clone of the listener
  list. Changes to the returned list will not affect the listeners
  currently attached to the Project. It also means that it is safe to
  iterate over the returned list if listeners are added or removed
  during the traversal.

* <pvcs> default filenameformat has been different from Ant 1.4.1.

* Some messages that are printed during startup will not be
  written to the logfile specified via -logfile as they might destroy
  the format of the file for special BuildLoggers (like XmlLogger).

* The filesetmanifest attribute added to <jar> after the 1.4.1
  release has been removed for now.  This change may affect only
  the 1.5Beta/1.6Alpha users.  An attempt will be made to add this
  feature back into Ant 1.6.
* Shipped XML parser is now Xerces 2.0.1 along with the XML Parser APIs.
  XML Parser APIs is a separate jar that contains the necessary
  JAXP/DOM/SAX classes.

* <telnet> was fixed to expand properties inside nested <read> and
  <write> elements; before this only happened when you assigned the text
  to the string attribute. If you had $ signs in the string, they may
  need escaping.

* the RegexpMatcher interface has been extended to support case
  insensitive matches and other options - custom implementations of
  this interface won't work any longer.  We recommend to use the new
  Regexp interface that also supports substitution instead of the
  RegexpMatcher interface in the future.

* <gzip> will throw an exception if your src attribute points to a directory.

* Unjar, Unzip and Unwar will throw an exception if the Src attribute
  represents a directory.  Support for nested filesets is provided
  instead.

* It is no longer possible to overwrite a property using tasks like
  <condition>, <exec>, <pathconvert>, or <tstamp>. In some exceptional
  cases it will generate a warning if you attempt to overwrite an
  existing property.

* Taskwriters please note: Whenever tasks had any overloaded set* methods,
  Ant's introspection mechanism would select the last overloaded method
  provided to it by the Java Runtime.  A modification has now been made such
  that when the Java Runtime provides a method with a String as its argument,
  a check is made to see if there is another overloaded method that takes in
  some other type of argument.  If there is one such method, then the method
  that takes in String as an argument is not selected by the Introspector.

* The pattern definition **/._* has been included into the Default
  Excludes list.

* <propertyfile>'s <entry> element was modified to remove "never" as a value
  as its behavior was undocumented and flakey.

* The -projecthelp flag now only prints out targets that include the
  'description' attribute, unless the -verbose or -debug flag is included
  on the Ant command line.

* Ant's testcases now require JUnit 3.7 or above, as they now use the new
  assertTrue method instead of assert.

* If the 'output' attribute of <ant> is set to a simple filename or a
  relative path, the file is created relative to ${basedir}, not ${user.dir}.

* The default value for build.compiler is now javac1.x with x
  depending on the JDK that is running Ant instead of classic/modern.

Fixed bugs:
-----------

* <available> could fail to find files or directories that happen to
  start with the name of the project's basedir but are not children of
  the basedir.

* Nested <property>'s inside <ant> can now be overriden by subsequent
  <ant> and <antcall> tasks.

* <xslt>'s outputtype attribute wouldn't do anything.

* <linecontains> filterreader could swallow lines.

* <sequential> used to configure the tasks (set their attributes)
  before the first task has been executed.  This means that properties
  that have been set by nested task seemed to be unset for the other
  tasks in the same <sequential> element.

* <javac>'s sourcepath setting has been ignored by some compiler
  implementations.

* <javadoc>'s packagelist attribute didn't work.

* the plain mailer would always use port 25 in <mail>.

* Ant's default logger could swallow empty lines.

* ejbjar's iPlanet nested element now can process multiple descriptors.

* IPlanetEjbc was looking in the wrong place for four iiop files.

* <javac> would pass the -source switch to JDK 1.3's javac, even
  though it doesn't support it.

* <zip> and friends would always update existing archive if you set
  the update attribute to true.

* To support backward compatibility with older versions, <pathconvert>
  will once again set the property, even if the result is the empty
  string, unless the new 'setonempty' attribute is set to false|no|off
  (default is "true").

* The manifest task would crash XmlLogger

* A bug existed that prevented generated log files from being deleted as
  part of the build process itself.  This has now been fixed.

* Fixed bug where <move> ignored <filterset>s.

* Ant works properly with the combination of Java1.4/WindowsXP.

* Fixed bug where <java> used to sometimes invoke class constructors twice.

* Fixed bug with 4NT shell support.

* Fixed bug where ant would not perform ftp without remotedir being
  specified even though this was not mandatory.

* Fixed bug where ant would not copy system properties into new Project
  in ant/antcall tasks when inheritall="false" is set.

* <propertyfile> would not close the original property file.

* <ant> will no longer override a subbuild's basedir with inheritall="true".

* Fixed problem with the built-in <junit> formatters which assumed
  that only one test could be running at the same time - this is not
  necessarily true, see junit.extensions.ActiveTestSuite.

* <jar>'s whenEmpty attribute is useless as JARs are never empty, they
  contain at least a manifest file, therefore it will now print a
  warning and do nothing.

* <typedef> hasn't been all that useful as it couldn't be used outside
  of targets (it can now) and nested "unknown" elements have always
  been considered to be tasks (changed as well).

* <fixcrlf> would fail for files that contained lines longer than 8kB.

* Some junit formatters incorrectly assumed that all testcases would
  inherit from junit.framework.TestCase.

* <fixcrlf> dropped the first characters from Mac files.

Other changes:
--------------

* <checksum> now uses a buffer (of configurable size).

* The "Trying to override task definition" warning has been degraded
  to verbose level if the two task definitions only differ in the class
  loader instance that has loaded the definition.

* Add a jvmargs to the ejbjar's weblogic element to allow additional
  arguments to be provided to the VM runnign ejbc. Document the
  jvmdebuglevel attribute which can be used to avoid warnings about
  interface classess being found on the classpath. Document the new
  <sysproperty> element which allows JVM properties to be defined.
  Added an outputdir attribute to allow the destination to be a
  directory into which the exploded jar is written.

* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5

* added **/.svn and **/.svn/** to the default excludes.

* Selector Elements now provide a way to create filesets based on
  sophisticated selection criteria.

* Gzip and Bzip2 files can now be constructed in the fly when using
  the tar task without having to create the intermediate tar file on
  disk.  The Untar task can also untar GZip and BZip2 files on the fly
  without creating the intermediate tar file.

* New optional type, <classfileset> added.

* <ejbjar> now allows control over which additional classes and interfaces
  are added to the generated EJB jars. A new attribute "dependency" can be
  defined which controls what classes are added. The addition of classes now
  uses the Jakarta-BCEL library rather than reflection, meaning bean classes are
  no longer loaded into Ant's JVM. The default dependency analyzer is known as
  the ancestor analyzer. It provides the same behaviour as the 1.4.1 version of
  <ejbjar>. If the BCEL library is not present, a warning will be issued stating
  the ancestor analyzer is not available. In this case <ejbjar> will continue
  to function but will not add super classes to the jar.

* <available> has a new attribute named ignoreSystemClasses.

* New task <cvschangelog/> generates an XML report of changes that occur
  on CVS repository.

* New filter readers: ClassConstants, ExpandProperties, HeadFilter,
  LineContains, LineContainsRegExp, PrefixLines, ReplaceTokens,
  StripJavaComments, StripLineBreaks, StripLineComments, TabsToSpaces,
  TailFilter.

* <copy>, <loadfile>, <loadproperties>, <move> support FilterChains
  of FilterReaders.

* New task <loadproperties> to load contents of file as Ant properties,
  with nested <filterchain> elements.

* New task <loadfile> to load a whole file into a property.

* New task <echoproperties> to list your current properties to the screen
  or a file.

* New tasks <bzip2> and <bunzip2> to pack and unpack files using the
  BZip2 algorithm.

* New tasks <replaceregexp>, <checksum>, <translate>, <waitfor>,
  <manifest>, <vsscp>, <vssadd>, <vsscreate>, <splash>, <basename>, <dirname>,
  <concat>, <sourceoffsite>, <jarlib-available>, <jarlib-display>,
  <jarlib-manifest>, <jarlib-resolve>.

* A new combined <mail> task, which replaces the old <mail> and
  <mimemail> tasks, has been added.  The <mimemail> task, and
  old SendEmail and MimeMail classes have been deprecated.

* Mail task allows specification of port number.

* Users can control what <zip> and <jar> must do when duplicate files
  are found.  A new element <zipgroupfileset> allows for multiple zip
  files to be merged into the archive.  In addition, <jar> also has
  another new attribute: filesetmanifest.  The existing manifest
  attribute of <jar> now also accepts the name of a jar added through
  a fileset.

* gzip now checks that the zipfile is older than the source file
  before rebuilding the zipfile.

* TarFileset takes in three new attributes - fullpath, prefix
  and preserveLeadingSlashes.

* <move> attempts to rename the directory, if everything inside it is
  included, before performing file-by-file moves.  This attempt will
  be done only if filtering is off and if mappers are not used.  This
  is a performance improvement and there is no change otherwise in
  the functionality of this task.

* Exec task has extra attribute "resultproperty" to get the return code
  into a property.

* Exec task prints a message when a timed-out process is killed.

* Added optional attributes - name, arch and version to the <os> task.

* Unjar, Untar, Unwar and Unzip now support patternsets to
  select files from an archive for extraction.  Filesets may be
  used to select archived files for unarchival.

* Javac task allows debug levels to be specified.  Debug levels
  will have an effect only when the modern compiler or the
  classic compiler (version 1.2 and higher) is used and debugging
  is enabled.

* Added support for specifying CVS_RSH in the <cvs/> task

* The attributes zipfile, jarfile, warfile and earfile (from the Zip,
  Jar, War and Ear tasks) have been deprecated and superseded by a
  new attribute "destfile".

* Added new conditions <isset>, <checksum>, <http>, <socket>, <contains>,
  <filesmatch>.

* <taskdef> and <typedef> will now emit a warning if a task/type of
  the given name already exists.

* A new revision of VAJ tasks: The most important new feature
  is the ability to execute VAJ tasks from the command line by
  exploiting the Remote Tool Access feature of VAJ.

* Improved support for Novell NetWare.

* Added an optional encoding attribute to <fixcrlf>.

* <apply> has a new attribute relative that allows users to pass the
  filenames as relative instead of absolute paths on the command line.

* References can now be copied into the child build by <ant> and
  <antcall> using nested <reference> elements or the new inheritRefs
  attribute.

* <fail> now supports builds to fail based on conditions via if and
  unless attributes.

* Ant now comes with two new BuildLogger implementations - one that
  can send emails containing a log of the build process (MailLogger),
  and one that colorizes the output based on message levels, using
  ANSI color code escape sequences (AnsiColorLogger).

* A "package" mapper type has been added to allow package directory
  names replaced with the dotted form.

* You can now specify environment variables in the <java> and <junit> tasks
  if the fork attribute has been set to true.

* -propertyfile command-line option has been added to load an entire
  property file just as -D properties are declared (as user properties).
  -D properties take precedence over -propertyfile specified ones.

* You can now set an ANT_ARGS environment variable to hold arguments you
  always want passed to the 'ant' command -- for example, if you always
  want to use a different logger or the -find flag.

* <tstamp> now supports a new "prefix" attribute to prefix properties set.

* You can now specify the -sourcepath for <javac> explicitly.

* <javac> now supports a new "listfiles" attribute to list the source
  files it's handing off to the compiler.

* The compiler implementation for <javac> can now be chosen on a task by
  task basis.  The new "compiler" attribute of <javac> can be used to override
  the value of the build.compiler property, if set.

* <javac> has a new nested element, <compilerarg>, which allows you
  to specify additional args for the specific compiler you're using.

* <javac>'s "source" attribute is now enabled for jikes as well.

* <propertyfile>'s <entry> now has a 'unit' attribute to specify the
  increment/decrement unit on date operations.

* <property> now supports a 'prefix' attribute when loading from a file
  or resource.

* In Ant 1.4, a feature has been added to the <junit> task that would
  add ant.jar, optional.jar and junit.jar implicitly to the classpath -
  this feature can now be disabled by setting the new includeantruntime
  attribute to false.

* <style> behaves differently from any other directory-based task, as it
  processes all files that it finds in included directories in
  addition to the files matched by your patterns.  There is now a new
  attribute, 'scanincludeddirectories', to suppress this behavior.

* <javadoc> now supports a <tag> nested element to provide the -tag option
  to the standard Java 1.4 doclet. The element is ignored when not running
  on Java 1.4.

* <ftp> can now chmod files on a remote server that supports
  "site chmod", as well as set the umask before transferring files, if
  the server supports "site umask".

* New <serverdeploy> "optional" task.

* <patternset> now supports nested patternsets.

* Perforce tasks now support a "failonerror" attribute (defaults to "true").

* Open Source application server JOnAS support:
    EJB hot deploy and deploy with <serverdeploy> and <ejbjar>

* Added new DirSet (<dirset>) datatype.

* <path> now supports nested <dirset> and <filelist> elements.

* <pathconvert> now supports nested <dirset> and <filelist> elements.

* <pathconvert>'s "dirsep" and "pathsep" attributes now accept
  multi-character values.

* <copy> task now has a 'failonerror' attribute to allow keep-going
  behaviour when the file to be copied is not found (defaults to "true").

* <uptodate> now has a 'srcfile' attribute to allow specifying a
  full-path filename.

* <exec>, <sql> and <java> now support append attributes to allow
  appending the output to an existing file.

* <java> now supports a timeout attribute analog to <exec> - it is
  highly recommended to only use it together with fork="true".

* <javadoc> now supports a source attribute to enable javadoc to
  handle assertions present in JDK 1.4 source code.

* <replace> supports a new replacefilterfile attribute that
  automatically turns all properties of a given file into
  replacefilters.

* An alias of <xslt> has been added to refer to the <style> task.

* The compiler implementation for <rmic> can now be chosen on a task by
  task basis.  The new "compiler" attribute of <rmic> can be used to override
  the value of the build.rmic property, if set.

* <rmic> has a new nested element, <compilerarg>, which allows you
  to specify additional args for the specific compiler you're using.

* org.apache.tools.ant.XmlLogger now is a BuildLogger, rather than just
  a BuildListener. It can operate in either mode successfully.

* <junit> has a new attribute "showoutput".  If set to true, output
  generated by tests will be sent to Ant's logging system as well as
  to the formatters (instead of sending it to the formatters
  exclusively).

* Ant has now a pluggable way to prompt users for input, which is used
  by the new <input> task.  IDE integrators can provide an
  implementation of the InputHandler interface to decouple Ant's input
  from the console.  An implementation that gets its input from a file
  for unattended builds is part of Ant's distribution.

  For more details see docs/manual/inputhandler.html.

* <patch> has a new attribute that selects the directory in which to
  run the command.

* <javadoc> now supports two new nested elements, <fileset> and <packageset>.


Changes from Ant 1.4 to Ant 1.4.1
===========================================

Fixed bugs:
-----------

* <ant>'s antfile attribute will now also be considered an absolute path on
  Windows systems, if it starts with a \ and no drive specifier.

* The fullpath attribute of <zipfileset> has been ignored if you used
  the src attribute at the same time.

* The manifest file is now always placed as the second entry (after /META-INF)
  in generated jars. This allows the manifest to be read by JarInputStreams

* Fixed bug in depend task which would fail with a NullPointerException if no
  dependency cache was specified.

* sql task now handles REM statements correctly so that lines starying with rem
  but which are not comments are actually processed.

* XMLLogger now uses the task's name rather than the classname

* <mapper>s will now work as expected if the to pattern expands to an
  absolute pathname.

* <javac> didn't ignore memory settings in non-fork mode

* <cab> didn't split the options attribute into several command line
  arguments correctly.

Other changes:
--------------

* New source attribute for <javac> to enable assertion in JDK 1.4

* XmlLogger and <antstructure> now add an encoding declaration to the
  XML files they generate.

* <fileset> has a new attribute "casesensitive" to make it match
  filenames in a case insensitive way (if you set it to false) - by
  default filesets remain case sensitive.

Changes from Ant 1.3 to Ant 1.4
===========================================

Changes that could break older environments:
--------------------------------------------
* JUnitReport now uses the xalan redirect extension for multi-output.
  With Xalan 1.2.2 it forces the use of bsf.jar in the classpath.
  (Available in the xalan distribution). It is recommended to switch
  to Xalan 2.x that do not need it.

* Zip.setWhenempty() has changed its signature.

* <rmic> is now implemented using a factory. This makes extending
  rmic to use a new compiler a lot easier but may break custom
  versions of this task that rely on the old implementation.

* several Zip methods have changed their signature as we now use a Zip
  package of our own that handles Unix permissions for directories.
  Furthermore <zip> will now use the platform's default character
  encoding for filenames - this is consistent with the command line
  ZIP tools, but causes problems if you try to open them from within
  Java and your filenames contain non US-ASCII characters. Use the new
  encoding attribute of the task and set it to UTF8 to get the old
  behavior.

* The <pvcs> task has been moved to a package of its own.

* JUnitResultFormater has two additional methods that must be
  implemented by custom formatters.

* Ant will no longer use the canonical version of a path internally -
  this may yield different results on filesystems that support
  symbolic links.

* The output generated by the xml formatter for <junit> has changed
  again, it doesn't format the numeric value in the time attribute anymore.

* Pattern matching rules have changes slightly, the pattern foo*
  doesn't match files contained in a directory named foo - use foo/*
  instead.

* <fixcrlf> will not remove trailing whitespace at the end of lines anymore.

* The Classloader usage has been changed for the taskdef, property, available
  and sql tasks so that it delegates to the parent classloader. This may cause
  ClassNotFoundExceptions to be thrown if a system class attempts to load a
  class in the taskdef's classpath (typically factory objects).

* Ant now allows multithreading of tasks and the containment of tasks within
  other tasks. This can break customer listeners which do not expect messages
  from a task before the previous task has finished.

* Ant now installs its own output stream into System.out to route output to the
  task currently executing on the current thread. This also means that all
  output is now routed as Ant message events. Customer listeners and loggers
  should not call System.out at any time. This has always been true but such
  usage now will cause problems due to possible recursion.

* Invalid manifest files will now cause build failures in the <jar> task.

* Ant Introspection now looks for methods with method names starting with
  addConfigured. When called these methods are passed an argument after it has
  been configured from the build file. Custom tasks supporting nested elements
  starting with the name configured will no longer function.

* The environment variable JAVACMD that can be used to specify the
  java executable to Ant's wrapper scripts must not contain additional
  command line parameters any longer - please use the environment
  variable ANT_OPTS for such parameters now.

* Ant's wrapper scripts now quote the CLASSPATH environment variable, thus
  supporting classpaths which refer to directories containing spaces. This means
  that the CLASSPATH environment variable cannot have quotes. Any quotes should
  be removed. This will not affect the operation of the CLASSPATH environment
  variable in other contexts.

* A delete task like
  <delete includeEmptyFilesets="true">
    <fileset dir="somedir" />
  </delete>
  will now remove "somedir" as well, unless there are still files left
  in it (matched by the default excludes).

* The copy task will now fail if the file to be copied is not found.

* Ant properties defined in properties files now behave the same way as
  properties defined in the build file. In particular the $ character needs
  to be escaped in property values by doubling it to $$. So, to define a
  property with the value $hello, you need to define it in a properties file
  as
    test.prop=$$hello
  This was not the case in Ant 1.3

Other changes:
--------------

* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout,
  typedef, sleep, mimemail, set of tasks for Continuus/Synergy, dependset,
  condition, maudit, mmetrics, jpcoverage, jpcovreport, jpcovmerge

* Ant now uses JAXP 1.1

* rmic now supports Kaffe's and Weblogic's version of rmic.

* new magic property build.rmic to chose the rmic implementation

* <tar> will now add empty directories as well

* you can now specify a description for <p4change>

* <touch> can now work on <fileset>s

* <uptodate> now supports a value attribute

* <fail> supports nested text

* <fixcrlf> won't override files that are already in the correct
   format.

* <sql> now supports REM comments as well as // and --

* <jar> now has a nested <metainf> element following the same idea as
  <war>'s <webinf>.

* <pvcs> can now handle multiple projects.

* <available> now has a "type" attribute you can use in conjunction
  with the "file" attribute to specify whether the "file" you're
  looking for is a file or a directory.

* New <junit> formatter named "brief"

* <ejbjar> changes
  * Add support for Borland Application Server to the <ejbjar> task using
    a <borland> nested element.
  * Add support for iPlanet Application Server to the <ejbjar> task. Also
    includes some iPlanet utility tasks
  * Add support for JBoss Application Server to the <ejbjar> task.
  * Add a naming attribute to control the naming scheme that
    ejbjar uses to name the generated EJB jars.
  * Weblogic element now sets the compiler class for EJB 2.0 beans
  * <dtd> elements can be specified at the <ejbjar> level for building generic
    beans
  * <dtd> elements can now be URLs
  * Allow the manifest to be specified for the generated jars
  * The weblogic element now supprts an attribte noEJBC to skip the processing
    of the jar by ejbc. The ejbc step will then occur at deployment
  * weblogic will tell ejbc to use Jikes compiler if build.compiler is set to
    jikes. It can be restored to the default, javac, operation if desired.

* Allow the <sql> Delimiter to be set in the so that Oracle stored procs may be
  entered

* <execon> and <apply> can now optionally skip empty filesets.

* <javadoc> has a new useexternalfile attribute that makes it use a
  temporary file for sourcefile and package names - helps to defeat
  command line length limitations.

* Data types like <path> can now be defined inside of <target>s

* you can now specify a classpath for <style> - the XSLZ processor
  will be loaded from this path

* added a force attribute to <style> to support dependencies that the
  task cannot determine itself (dependency on parameters, not file
  modification times for example)

* added vmlauncher attribute to exec tasks. This defaults to true. If
  it is set to false, the VM's ability to launch commands in bypassed
  and the OS shell, either directly or through the auxiliary antRun
  scripts is used.

* regexp mapper now supports the java.util.regex package of JDK 1.4.

* New filesonly attribute for <zip> and friends to suppress directory
  entries.

* New update attribute for <zip> and friends - update an existing
  archive instead of creating a new one.

* <apply> and <execon> have been merged into a single task.

* added vssver.scc to the default excludes

* <available> has a new filepath attribute/nested element that allows
  you top search for a file in a given path.

* <junit> can now optionally set a property on test failure.

* <taskdef> can now define several tasks at once, reading the
  name/classname pairs from a property file or resource.

* <unzip/unjar/unwar> and <untar> now have an overwrite attribute that
  defaults to true.  If set to false, files that are newer than the
  files in the archive will not be replaced.

* <patternset> and <fileset> now support nested <in/excludesfile>
  elements - using these you can have more than one in/excludes file
  per <patternset>.

* Three new supported compilers for javac: kjc for kopi, gcj for the
  gcc frontend and sj for Symantec's compiler.
  In addition extJavac or the new fork attribute can be
  used to run the JDK's javac in a JVM separate from Ant.

* <fixrlf> can now with CR only line-ends and can use an arbitraty
  between 2 and 80.

* The .NET tasks have been adapted to the beta2 release of the framework.

* <move> will now try to rename() files before copying them byte by
  byte - only if filtering is of, of course.

* <ant> and <antcall> tasks now support a new attribute inheritAll. When set to
  false, only user properties are passed through to the target Ant instance.
  This includes properties set on the command line and properties explicitly
  passed

* <javadoc> now skips off line links if the package list cannot be found.

* <wlrun> now allows the security policy file to exist outside the weblogic
  directory.

* <java> task will set the Thread contextClassLoader under JDKs 1.2+ to the
  classloader for the class being executed.

* Introduce the concept of a TaskContainer - a task or element which can contain
  Ant Tasks.

* Add new tasks implementing the TaskContainer interface <parallel> and
  <sequential> which allow parallel execution of tasks to be specified.

* <depend> task will now take into account dependencies on jar files and class
  files from a given classpath.

* <jar> manifest entries may now be specified in the build file either
  completely or to be merged with a manifest file.

* <tstamp> task custom formats now support locales.

* Added a listner which will forward events to Log4J. The log4j configuration
  file should be in the directory from which Ant is run or passed as a system
  property using a JVM argument.

* Introduced the concept of <filtersets> to allow for more control in which
  filters get applied in a <copy> or <move> operation.

* Added nowarn attribute to javac and deprecated the Jikes-magic property
  build.compiler.warnings.

* The <depend> task cache format has changed and all dependency information is
  now stored in a single file.

Fixed bugs:
-----------

* Testcases have been made independent of current working directory.

* Input ZIP-Files will be closed when using a <zipfileset>.

* p4 tasks now don't fail if user, port or client have been omitted
  (and this is acceptable for the context of the command).

* <javah>'s outputfile attribute will be resolved as relative to the
  projects basedir.

* <antstructure> should create a valid DTD for propertyfile.operation.entry
  and omit tasks it fails to load.

* won't try to pass a -bootclasspath flag to javac 1.1 anymore

* <style>'s style attribute no handles absolute paths correctly.

* <delete includeemptydirs="true"> now deletes more than just the leaf
  directories.

* You can now specify a <fileset> for a directory that doesn't exist at
  declaration time but will created before the fileset gets used for the
  first time.

* If the quiet attribute has been set, <delete> will handle <fileset>s
  with non-existing directories gracefully.

* Output written by testcases will now be captured by the <junit> task
  and passed to the formatters.

* Quote the -group parameter to Javadoc as per the specification

* Initialise classes when loaded through the AntClassLoader - that is, run
  static initializers

* Implement getResource() and getResources() in AntClassLoader

* Create the <ejbjar> weblogic command line as a set of arguments rather than
  as a single line. Avoids problems with paths which contain spaces.

* <ejbjar> now fails when the weblogic ejbc compiler reports an error.

* Make the AntClassLoader load resources in the same order as it currently
  loads classes.

* Handle classpaths with spaces

* Make sure XSLT processors close their output files in <style>.

* perform proper uptodate check in <rmic> when compiling for IIOP.

* <jjtree>'s uptodate test works even if outputdirectory is not the
  parent dir of target

* <copy> will remove target file (if it exists) before writing to it -
  this avoids problems with links on filesystems that support them.

* <ftp> now properly recurses remote directories.

* <ftp> closes remote connection when it's done.

* <junit> tries to include all necessary classes for the task itself
  to the classpath when running in fork mode - doesn't work for JDK 1.1

* <apply> and <execon> do now execute the command only once, if you
  specify the parallel attribute - instead of once per fileset.

* directory based tasks and fileset could miss some included files in
  directories that have been excluded

* <fixcrlf> failed for large files.

* <move> removed files you tried to move to themselves.

* <sql> task will not trty to print the result set unless the query succeeded.

* Ant classloader will now ignore paths which are invalid relative to the
  project base

* <ejbjar> weblogic elements check for jar file changes has been fixed.
  Previously some changes would not be included.

* properties loaded from properties files are now resolved internally. This
  removes the spurious warnings about usage of properties which have not been
  set.

* <jar> task and friends now process the JAR manifest to ensure it is valid.

* The task finished event now includes any exception thrown by the task.

* <java> task now supports a jvmVersion attribute so that if another JVM is
  being used, Ant can determine which options to use for features such as the
  VM memory limits


Changes from Ant 1.2 to Ant 1.3
===========================================

Changes that could break older environments:
--------------------------------------------

* Ant doesn't search for the buildfile anymore, unless you use the new
  -find argument.

* <perforce> has been replaced by a number of new tasks.

* <javac> is now implemented using a factory. This makes extending
  javac to use a new compiler a lot easier but may break custom
  versions of this task that rely on the old implementation.

* The output generated by the xml formatter for <junit> has changed a
  little, it doesn't append " sec" in the time attribute anymore.

Other changes:
--------------

* A GUI Frontend: Antidote. This is currently in development. At this
  time, this is not part of the Ant release, although the source is
  included if you are interested.

* New tasks: stylebook, propertyfile, depend, antlr, telnet, csc,
  ilasm, apply, javah, several clearcase tasks, junitreport, sound

* Added output attribute to <java>.

* Added nested zipfileset element to <zip>

* Changed <sql> so that printing is at the task level rather than
  the statement level.

* javadoc task will pass -d flag to any doclet if the destDir attribute is
  given. If the doclet does not accept the -d flag then omit the destdir
  attribute.

* <cab> can work on non-Windows platforms with the help of libcabinet.
  See http://trill.cis.fordham.edu/~barbacha/cabinet_library/.

* <ftp> now supports passive mode.

* New <mapper> data type that can be used to get influence on the
  target files for some tasks like <copy> or enable new types of tasks
  like <apply>.

* <execon> provides more control over the command line now, the names
  of the source files are no longer required to be at the end of the
  command.

* Style tasks will now support TraX compliant XSL processors if one is present
  in your classpath.

* Added a failonerror to the javac task. If set to false, the build will
  continue even if there are compilation errors.

* Added nested format elements to the tstamp task allowing additional time
  formats to be defined for arbitrary properties.

* Added classpath attribute and nested classpath element to <property>
  to make the resource attribute more powerful.

* ${} property expansion will now be performed on the patterns read
  from files specified as includesfile or excludesfile attributes.

* The <tar> and <untar> tasks now support GNU format for handling paths
  which are greater than 100 characters in length. In addition the <tar>
  task now supports nested filesets through which the file permissions
  may be controlled.

* wlrun, wlstop and ejbjar now support Weblogic 6.0

* The MPasre task has been updated to work with MParse 2.0

* The documentation has been significantly updated.


Fixed bugs:
-----------

* <signjar> no longer uses deprecated methods.

* javadoc's failonerror attribute works again

* javadoc's additionalparam attribute will now be split into separate
  parameters (on spaces) to allow for more than one parameter.

* Changed <sql> task so that printing result sets works on Oracle

* Changes to ddcreator and ejbc helper to respect the descriptor hierarchy
  keppgenerated in ejbc can now be turned off

* ejbjar now correctly ignores <ejb-ref> elements in the deployment descriptor.
  CMP files are included by parsing the weblogic deployment descriptor rather
  than relying on the naming convention used in ant 1.2

* ejbjar includes super classes and super interfaces into the generated ejb
  jar files. The <support> nested element allows support classes to be
  included in the EJB jar. The toplink element should now correctly locate
  the toplink descriptor.

* <vssget> now correctly deals with spaces in arguments

* <jar> fails early if a given manifest file doesn't exist

* <rmic> doesn't search for the _Skel file anymore when stubversion is
  set to 1.2.

* <rmic> uses the the same classpath to verify a class can be rmic'd
  as it passes to the compiler.

* org.apache.tools.mail.MailMessage (and therefore <mail>) can now
  handle SMTP servers sending multi line responses.

* nested <classpath> elements of <taskdef> now work for <taskdef>s not
  nested into <target> as well.

* <property> and <available> will search for the resource "foo" instead
  of "/org/apache/tools/ant/taskdefs/foo" when given a relative resource
  name foo.

* Handle build files in directories whose name contained a "#" character

* <junit> can now log to files whose name contains a comma as well.

* The AntClassLoader now refers to the loader which loaded it, any
  requests it does not handle itself. Previously these went to the
  primordial loader.

Changes from Ant 1.1 to Ant 1.2
===============================

Changes that could break older environments:
--------------------------------------------

* Semantics of <property> has changed again in the hope to be more
  intuitive. ${} expansion now happens at runtime and <property> tags
  living inside of targets only take effect if they are visited at
  runtime.

  As a side effect of this change, task's attributes get set at runtime
  not at parser time as well, which might change the results of
  <script>s or other custom tasks that reference other tasks by their id
  attribute.

* copying of support files in <javac> has been removed - as well as
  the filtering attribute.

* the <expand> and <keysubst> tasks have been removed.

* the ignore and items attributes of directory based tasks have been removed.

* the command line switches _not_ starting with - have been removed.

* Path and EnumeratedAttribute have been moved from
  org.apache.tools.ant to org.apache.tools.ant.types.

* the class attributes of <available>, <java>, <rmic> and <taskdef>
  have been removed.

* the src attribute of <chmod> has been removed.

* <patch> and <javadoc> have lost some of their attributes.

* <java> and <cvs> have lost some undocumented attributes.

* the Unix antRun script would search for command.sh in the directory
  it changed to and invoke this instead of command if present. This
  behavior has been dropped.

* <ejbjar> task syntax has been changed significantly

* <exec> is no longer implemented by org.apache.tool.ant.taskdefs.Exec.
  Custom tasks that rely on Project.createTask("exec") to return an
  instance of this class are going to fail.

* nested <include> and <exclude> elements expect the value of their
  name attribute to be a single pattern, they don't accept multiple
  patterns anymore. Split them into multiple elements of the same type.

* <delete dir="somedir" /> will now delete the directory itself as
  well as all included files. If you just want to clean out the
  directory and keep the empty one, use a nested fileset.

Other changes:
--------------

* New tasks: antstructure, cab, execon, fail, ftp, genkey, jlink,
  junit, sql, javacc, jjtree, starteam, war, unwar, uptodate,
  native2ascii, copy, move, mparse.

* copydir, copyfile, deltree and rename are now deprecated. They
  should be replaced with the new copy, delete and move tasks.

* <java> uses a ClassLoader of its own in no-fork mode if a classpath is
  specified.

* <style> will create the necessary target directories and reprocess
  all files if the stylesheet changes.

* New data types fileset and patternset - expected to get a broader use.
  They, as well as PATH like structures, can now be defined on a global
  level and later be referenced by their id attribute.

* You can specify environment variables to <exec>.

* <get> can check whether a remote file is actually newer than a local
  copy before it starts a download (HTTP only).

* Added a -logger option to allow the class which performs logging to be
  specified on the command line.

* Added a -emacs option to tell the logger to leave out taskname adornments
  on log output.

* <chmod> works on all files in parallel and supports multiple filesets.

* <replace> can now use tokens and/or values that cross line boundaries.

* build.compiler supports now jvc as well.

* project specific help can now be obtained with the -projecthelp option.

* Added a -debug option to make -verbose less verbose (and more useful)

* Ant will now search for a file named build.xml in the parent directory
  and above (towards the root of the filesystem) if you didn't specify
  -buildfile and there is no build.xml in the current directory.

* <echo> can now write to a file and accepts nested text.

Fixed bugs:
-----------

* <chmod> didn't work when used as a directory based task.

* Path, Available, Property didn't resolve relative filenames with
  respect to the Project's basedir.

* Project didn't interpret the basedir attribute correctly in all
  cases.

* Nested <src> in <javac> caused NullPointerException.

* Corrupt Zip- and Jar-files ar now deleted if the task fails.

* many more fixes we've forgotten to document here ...

* The packagelistloc attribute of <javadoc>'s <link> child will be
  resolved as a file (i.e. it is either absolute or relative to
  basedir).
