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 ouput 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 attribute 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 XSLT 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 arbitrary
  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 try 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> doesn't use deprectated methods anymore.

* 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).
