Java Service Wrapper Revision History.
--------------------------------------
3.1.1
* Modified the way libwrapper.so is built on Solaris and Linux so that it
  no longer statically links its required libraries.
* Fix a file handle leak when calling WrapperManager.getUser or
  WrapperManager.getInteractiveUser on Windows platforms.
* Fix a problem introduced in 3.1.0 where the JVM would not be restarted
  correctly if it quit after a ping timeout to let the Wrapper resynch and
  restart it.
* Fix a problem where CTRL-C was not being handled correctly if the console
  was configured to be shown when running as an NT service.
* Fix a problem where signals fired at UNIX versions of the wrapper were
  not being handled correctly when the tick timer was being used.
* Fix a synchronization problem in the logging code which would
  occassionally cause the Wrapper to crash with an Access Violation.
  The problem was only encountered when the tick timer was enabled,
  and was only seen on multi-CPU systems.  Bug #949877.
* Fix a problem when using the tick timer where the Wrapper would sometimes
  exit on startup due to an uncaught SIGALRM.  Only reported on multi-CPU
  Solaris systems.
* Fix a problem where the Wrapper would sometimes hang on shutdown if
  another thread called System.exit while the Wrapper was shutting down.
  Bug #955248.
* Fix a problem introduced in 3.1.0 where a very very large CPU timeout
  warning message was being displayed if the system time was set back
  while using the default system timer.
* Added a new property, wrapper.anchorfile, which makes it possible to
  cause the Wrapper to shutdown by deleting an anchor file.  The UNIX sh
  script has been modified to optionally make use of this feature.
* Add a debug message at startup which makes it clear which timer is being
  used.
* A Windows user reported that using forward slashes in the path the log
  file was failing.  Avoid this problem by always converting '/' to '\'
  in the wrapper.logfile property on Windows.
* Fix a problem where is was not possible disable the wrapper log file as
  documented in the wrapper.logfile property.  Most likely broken way back
  in version 2.2.5.
* Add some additional error checks after calls to control the pipe between
  the JVM and Wrapper as well as improving the messages around other socket
  related error messages.
* Fix a problem on some HP-UX systems were not working correctly because
  the EAGAIN and EWOULDBLOCK constants are not equal with some compilers.
* Change some of the defaults in the src/conf/wrapper.conf.in file which
  ships with the Wrapper to avoid confusion with new users.
* Rewrote the routine which reads and logs console output from the JVM
  for Windows versions.  Internal buffers are now scaled dynamically,
  fixing a problem where long lines were being wrapped at 1024 characters.
  This rewrite also resulted in a 4 fold increase in speed when the JVM is
  sending large quantities of output to the console.
* Increase debug output on UNIX platforms when a signal is caught.  When
  possible, information about where the signal came from is now logged.
* Modified the way log output from within signal handlers is handled so it
  is now queued and then logged by the main event loop.
* Back out a 3.1.0 change where a JVM that had failed to exit cleanly was
  sent a SIGTERM prior to a SIGKILL.  The SIGTERM made no difference and
  slowed down the forced shutdown.  A modification to the event loop made
  the functionality more difficult to implement.
* Add the ability to set the user that the Wrapper and its JVM will run as
  from within the sh script on UNIX platforms.
* Add an icon resource to the Wrapper binary on Windows versions.
* Fix a typo in the UNIX sh script which caused an extra slash to be included
  in the path of the pid file.  Was not causing any known problems.
* Added support for 64-bit HP-UX.  Big thanks to Venkatesh Sellappa for
  supplying the patch.
* Fix a deadlock problem introduced in 3.1.0 with some FreeBSD systems.  Not
  all users were experiencing it, but those who did were able to reliably
  reproduce the problem.  The problem appears to have been caused by
  FreeBSD bug #kern/64313.
* Make the signal handling variables in the wrapper native library volatile.
  Directly this was to fix a compiler warning on HP-UX64 systems but it
  should also make the calls more efficient.

3.1.0
* The license was revised for this version to include a copyright omission.
  This change is to be retroactively applied to all versions of the Java
  Service Wrapper starting with version 3.0.0.  The changes should have
  no effect on users.
* The Online documentation and web site were both reworked.  The logo has
  been updated so that Duke is no longer used.  The new online site now
  has the ability for users to logon and append comments to any page.
* Added a new batch file which accepts commands like the UNIX shell script.
  The new file is offered as an alternative to the default batch files, and
  can be found at src/bin/AppCommand.bat.in.  Thanks to Mike Castle for
  donating the new script.
* The Windows version of the Wrapper was not correctly registering that it
  would accept SHUTDOWN messages when running as a service.  The Wrapper
  was getting the message anyway so this should not change functionality.
  Thanks to Jason Tishler for noticing this and sending in a patch.
* Add a new property, wrapper.native_library, which can be used to specify
  the base name of the native library which is loaded by the WrapperManager
  class.
* Modify the WrapperManager class so it now stores references to System.out
  and System.err on initialization and always writes to those stored streams.
  This makes sure that all Wrapper console output always goes to the
  wrapper.log file even if user code overrides those streams with calls to
  System.setOut and System.setErr.  This was necessary to prevent deadlocks
  in such user code from affecting the functionality of the Wrapper.
* Fixed a problem where some environment variables where not being correctly
  loaded from the system registry when running as an NT service.  Big thanks
  to Eric Smith for tracking this down and submitting a patch.  It turns out
  that the putenv function was not being used correctly.
* Modified the way the wrapper.conf file is loaded so it will now read the
  contents correctly even if the line feeds in the file are incorrect for
  the current platform.  Windows line feeds had been causing problems when
  used on UNIX platforms.  Feature Request #829896.
* Added a new property, wrapper.ntservice.console, which allows a console to
  be displayed when running as an NT service.
* Fixed a problem where the request thread dump on failed JVM exit feature
  had never worked when running as an NT service.  Bug #831775.
* Add a new property, wrapper.console.title, which makes it possible to set
  the title of the console in which the Wrapper is currently running.  This
  currently only works on Windows platforms.
* Added a new method, setConsoleTitle, to the WrapperManager class which
  enables the application to dynamically set the console title.  Like the
  wrapper.console.title property, this only works on Windows platforms.
* Improved the algorithm of the request thread dump on failed JVM exit feature
  so that extremely large thread dumps will not be truncated when the JVM
  is killed.
* Fix a problem where CTRL-C was being ignored by the WrapperManager if a
  WrapperListener is never registered.  This is not possible if the Wrapper
  is being used correctly but never the less a user did come across it.
* Add some additional debug output to help identify the cause of problems
  loading the native library.
* The WrapperManager class now checks to make sure that its current version
  matches the version of the native library and Wrapper.  If there are any
  discrepancies found then appropriate warnings will be displayed, but the
  Application will still be allowed to start.  This was added to make obvious
  the cause of problems resulting from mismatched versions.
* Added a new property wrapper.use_system_time system time.  By setting this
  property to false, the Wrapper will start using a new experimental timer
  which uses a background thread to manage time rather than the system time.
  This has a number of advantages over using the system time and should give
  most users even more reliable behavior when the system is under high load
  or there are changes being made to the system time.  The timer is very
  critical to the operation of the Wrapper so the old behavior is left as
  the default for the time being until this feature has had the chance to be
  "time" tested.  If all goes well then this will be enabled as the default
  in a future version of the Wrapper.
  A pair of related properties, wrapper.timer_fast_threshold and
  wrapper.timer_slow_threshold were also added to aid in debugging.
* Rework the logging code so it is now thread safe.  The addition of the
  timer thread means that there is now more than a single thread accessing
  that code.  This was causing problems as the two threads tried to use the
  same buffers.  As part of this change, a new format variable 'D' was added
  to display the thread which is doing the logging.
* Fix a problem where a thread dump would be invoked if the request thread
  dump on failed JVM exit was enabled and the user forced an immediate
  shutdown by pressing CTRL-C more than once.
* Add getUser and getInteractiveUser methods to the WrapperManager class to
  make it possible for user code to query information about the user running
  Wrapper or the user who is interacting with the Wrapper and its JVM.
  Feature Request #812175.
* The Wrapper will now always exit with the exit code used to terminate the JVM
  whether System.exit is used or WrapperManager.stop.  When running as an NT
  service the Wrapper now correctly returns the correct exit code to the
  service manager so failure recovery tools should now work correctly.
  Feature Request #852491.
* Add a status command to the UNIX shell script which can be used to find out
  whether or not the wrapper is currently running.  Patch submitted by
  Joseph Benavidez.
* Modify the WrapperSimpleApp and WrapperStartStopApp so that the main method
  of a class is located even if it exists in a parent class rather than the
  class specified.
* To make debugging classpath problems easier, the Wrapper now verifies all
  classpath entries before launching a JVM and logs debug level warnings for
  any entries that do not exist.
* Fix a problem where it was possible to define a zero length filter that would
  trigger on any output.
* Add some additional debug output to make it easier to debug startup,
  shutdown and restart problems.
* Modify the way the Wrapper forcibly kills a frozen JVM on UNIX platforms so
  that it now sends a SIGTERM, waits up to 5 seconds, then sends a SIGKILL.
* Add a new wrapper.java.library.path.append_system_path property which will
  cause the Wrapper to append the system path to the generated library path.
  Feature Request #917902.
* Fix a problem where spaces around the '=' character of a property definition
  were rendering the property invisible to the Wrapper.  Bug #916001.
* Fix a problem where the first ping timeout after the JVM was started was
  still hard coded at 30 seconds.  This was causing a combination of large
  values of wrapper.ping.interval and wrapper.ping.timeout to fail.
* Fix a problem where the JVM would fail to shutdown cleanly if the Wrapper
  was asked to stop too soon after launching a JVM.  This was leading to the
  JVM being killed after the shutdown timeout expired.  Bug #917281.
* Added an adviser which will print out explanatory messages to the console
  and wrapper log file when the Wrapper encounters a commonly made
  configuration mistake.  This is designed to cut down on support requests
  by new users.  Can be disabled using the wrapper.adviser property.
* The bash script and the realpath utility have been deprecated since version
  3.0.3.  They have been removed in this release.  The sh script is recommended
  on all UNIX platforms, and the realpath utility which was used by pre-3.0.3
  bash and sh scripts has not been used since.
* Add the wrapper.startup.delay property along with console and service
  specific variants which make it possible to configure a delay between the
  Wrapper being launched and the first JVM being launched.
* Promote the wrapper.debug property back from being "deprecated".  It has
  continued to be useful and deserved documentation and official status.
* Add wrapper.on_exit.<n> properties to control what happens when a exits
  based on the exit code.
* Modify the way calls to System.in.read() are handled so that they now block
  rather than throwing an exception.  Currently, System.in can not be used with
  the Wrapper because of the way I/O is passed between the Wrapper and JVM.
* Modified the Windows batch files to fix a problem where the path to the
  Wrapper.exe contained more than one "/bin".  The new batch files are much
  simpler and should be easier to customize if needed.  Bug #925308.
* Modified the wrapper.java.initmemory and wrapper.java.maxmemory properties
  so that they now default to a value of 0 which causes the -Xms and -Xmx
  parameters to be omitted from the command used to launch Java.  This
  will cause the JVM to use its own default values and also makes it possible
  to specify the memory parameters using the wrapper.java.additional.<n>
  properties.
* Added a pair of environment variables, WRAPPER_FILE_SEPARATOR and
  WRAPPER_PATH_SEPARATOR, whose values are set to either '/' and ':' or
  '\' and ';' on startup.  They can be used in the wrapper.conf file
  to construct platform independent property values.
* Add a new wrapper.working.dir property which makes if possible to change
  the Wrapper and JVM's working directory to a location other than the
  location of the Wrapper binary. Feature Request #738160.

3.0.5
* Added support for SGI Irix.  Big thanks to Andreas Wendt for supplying the
  patch.
* Due to a bug in the build, the native library was not included in the 3.0.3
  or 3.0.4 binary releases for OSX, building from source was working correctly.
  This has been fixed and the build greatly simplified to avoid such problems
  in the future. Bug #791755.
* Changed the default location of the pid file generated by the sh script to
  exist in the same directory as the sh script rather than in the /var/run.
  This can be changed by setting the PIDDIR variable in the sh script used to
  launch the Wrapper.
* Added support for the wrapper.pidfile property on the Windows platform.
* Added the wrapper.java.pidfile property which will cause the pid of the
  java process to be written to a specified file.
  (WINDOWS USERS) If you are using a wrapper.conf file that was created prior
  to version 3.0.0 of the Wrapper, then you may have this property defined in
  your configuration file.  You will get an error on startup if the specified
  path does not exist.
* Stop clearing the file creation mask when the Unix version of the Wrapper is
  run as a daemon process.  The file creation mask will not be inherited from
  the process which launches the Wrapper.  Bug #788849.
* Modify the sh script so it works on Linux, then deprecate the bash script.
  This means that all Unix platforms can now use the same script to control
  the Wrapper. Thanks to Mike Castle for the patch.  The bash script can still
  be found in the release, but it is deprecated and will be removed in a
  future version.
* Modified the sh script so it is now possible to set the nice priority in the
  script configuration block.
* Remove output to System.out in the WrapperManager.requestThreadDump() method.
  If some JVM threads were hung while accessing the System.out object,
  attempting to do a thread a dump would cause the calling thread to hang as
  well.  Thanks to Thomas Hart for the patch.
* Make it obvious in the log whether or not the Wrapper was started as a
  daemon process on UNIX systems.
* Modify the way restarts requested from the JVM, or caused by a filter are
  handled.  The Wrapper will no longer reset the restart count in either of
  these cases.  If an application runs for longer than the
  wrapper.successful_invocation_time timeout then the count will still be
  reset back to 0.
* Added a new wrapper.ignore_signals property which makes it possible to
  configure the Wrapper so it will ignore CTRL-C, HALT and INT signals.
* Modify the WrapperManager.isLaunchedAsService() method on UNIX systems so it
  now returns true if the Wrapper was launched with the wrapper.daemonize flag
  set.
* Added a pair of MBean interfaces which allow the Wrapper to be controlled
  using JMX.  See the new JMX section in the documentation for details.
  Thanks to Sal Ingrilli for help with testing.
* Modify the Windows build so the Wrapper.exe and Wrapper.dll files can now
  be built from Ant if MSVC is installed.
* Added a new wrapper.ping.interval property which lets users control the
  frequency that the Wrapper pings the JVM.  Feature Request #607768.
* When a JVM refuses to shutdown, the Wrapper can be configured to request a
  thread dump using the wrapper.request_thread_dump_on_failed_jvm_exit
  property.  The Wrapper was then waiting 1 second before the process was
  killed.  This was not always long enough, resulting in a truncated thread
  dump.  Increased the pause to 3 seconds.  Feature Request #633761.
* Fix a bug where wrapper.app.parameter.<n> and wrapper.java.additional.<n>
  properties declared from the Windows command line were not correctly
  handling spaces in their values.  Support Request #802139.

3.0.4
* Fix a problem on UNIX systems where requesting a second thread dump any time
  during the life of a single Wrapper process would cause the Wrapper and JVM
  to shutdown rather than perform the thread dump.
* Fix a problem where a, user without permission, attempting to stop an
  application was able to delete the pid file even though they were unable
  to stop the application itself.  This would make the scripts think that
  the application was stopped when was actually still running.
* Fix a problem where an application was being killed prematurely if it took
  longer than 6 seconds to exit on its own.  The scripts now make sure that
  an application always has enough time to shutdown cleanly.
* Improve the debug output so that packet codes are now shown using a name
  rather than a raw number.
* Reduce the frequency of "Waiting to stop..." messages displayed when removing
  an NT service that is currently running.  Decreased frequency from once per
  second to once every five seconds.
* Fix a minor problem where the hour in the date returned by
  WrapperInfo.getBuildTime() was not base 24.
* Added -t and -p command line options to the Windows version of the Wrapper
  to sTart and stoP the Wrapper as an NT service.  This can be used in place
  of "net start" and "net stop", which do not always work correctly when a
  service takes a long time to start up or shutdown.  See the Launching Your
  Application (Win32) section for more details.
* Add a new method WrapperManager.stopImmediate which will cause the JVM to
  exit immediately without calling any stop methods or shutdown hooks.
* Add a new class, WrapperActionServer, which makes it easy to remotely control
  the Wrapper remotely by opening a socket and sending commands.  See the
  javadocs of the class for more details.
* Fix bug #744801.  A Java GUI was not being displayed when the application was
  run in either console mode or as a service with wrapper.ntservice.interactive
  enabled.  This problem was introduced in Version 3.0.0 when using 1.2.x or
  1.3.x versions of Java.  To use interactive services with 1.2.x or 1.3.x
  versions of java, please review the documentation for the
  wrapper.ntservice.interactive property.
* Fix a problem where the JVM was not receiving CTRL-C and CTRL-CLOSE events
  when running under the Wrapper on Windows.  This was not a problem in most
  cases as the Wrapper was taking care of the processing of the events.  But
  the WrapperListener.controlEvent() method was not being called as documented.
* Changed the way the WrapperSimpleApp and WrapperStartStopApp respond to
  control events so that the JVM will respond and call WrapperManager.stop()
  even when being controlled by the Wrapper.
* Modified the suggested behavior of the WrapperListener.controlEvent() method.
  Users who have implemented the WrapperListener interface themselves should
  review the Javadocs.  The changes are not required and applications will
  continue to function as they did before.
* Added support for DEC OSF1 (Alpha).  Big thanks to Andreas Wendt for
  supplying the patch.
* Fix a problem where the sh and bash scripts were failing if the path to the
  script contained spaces.
* Fix a problem where the JVM would sometimes hang when trying to shutdown if
  the wrapper.key parameter was passed to the JVM while not being controlled
  by the Wrapper.  This would happen if a user copied the command from the
  Wrapper's debug output and attempted to run it as is without first removing
  the wrapper.key parameter.
* Implement the ability to specify an NT service's load order group in response
  to feature request #764143.  See the javadocs for the new
  wrapper.ntservice.load_order_group property for details.
* Improve the error message displayed when the NT EventLog is full in response
  to feature request #643617.  The EventLog output will now be disabled if any
  errors are encountered while logging events.  This prevents the error from
  repeating.
* Improve the error message displayed on Windows when the configured Java
  command can not be executed or does not exist.
* Fix a problem where the Wrapper was leaving a pipe unclosed each time the JVM
  was restarted on all UNIX platforms.  This was causing the Wrapper to run out
  of file handles.   Bug #767267, discovered and patched by David Wong.
* Fix a problem where the '#' character, which signifies a comment, could not
  be included in property values.  A double hash, '##' will now resolve into a
  '#' within the property value.  Bug #777303.
* Added support for FreeBSD.  Big thanks to Alphonse Bendt for supplying the
  patch.
* Make the wrapper.port property optional.
* Changed the way environment variables are loaded from the registry on Windows
  platforms so users will no longer get warning messages about not being able
  to handle very large environment variables.  Prior versions could only handle
  environment variables whose expanded value was less than 2048 characters in
  length.
* Fix a problem on UNIX platforms where a shell used to start the Wrapper
  running as a detached process would hang when the user attempted to exit
  the shell.  Thanks to Mike Castle for this patch.

3.0.3
* Added support for Mac OS X.  Big thanks to Andy Barnett for supplying the
  patch.
* Fix a segmentation fault on UNIX systems when the first console output
  from the JVM was an empty line.  Thanks to Mike Castle for finding this.
* Fix a problem where a 0 length malloc was being called if there were no
  configured filters.  This was fine on most platforms but caused a crash
  on MAC OS X.
* Rework the initialization of the bash and sh scripts so that they will
  work correctly when referenced as symbolic links.  Thanks go out to Richard
  Emberson for the code to resolve symbolic links.
* Deprecated the realpath binary in the *NIX distributions as it is no longer
  used by the bash or sh scripts.  It is being left in for now so as not to
  break the build scripts of other projects, but it will be removed after a
  couple more releases.
* Added a test to make sure that wrapper.ntservice.interactive is not set to
  TRUE when an account is specified using wrapper.ntservice.account.

3.0.2
* Modified the sh and bash scripts so that console log output is disabled by
  default when the scripts are launched with the 'start' action.  Running with
  the 'console' action will still send output to the console.  Logging to the
  file is still enabled.
* Modified the wrapper.ping.timeout property so it also controls the ping
  timeout within the JVM.  Before the timeout on responses to the Wrapper
  could be controlled, but the ping timeout within the JVM was hardcoded to
  30 seconds.
* In the last release, some work was done to avoid false timeouts caused by
  large quantities of output.  On some heavily loaded systems, timeouts were
  still being encountered.  Rather than reading up to 50 lines of input, the
  code will now read for a maximum of 250ms before returning to give the main
  event loop more cycles.
* Fix a problem where the values of environment variables set in the
  configuration file were not correct when those values included references
  to other environment variables.
* Fix a potential buffer overflow problem if configuration properties
  referenced extremely large environment variables.
* Fix a potential problem where the inability to expand very large environment
  variables would have led to an access violation when run as an NT service.
* Add some extra checks in the event where the native library can not be loaded
  so that the WrapperManager can differentiate between the library missing and
  not being readable due to permission problems.
* Remove the wrapper.ntservice.process_priority from the default wrapper.conf
  because its use can produce unexpected results if used improperly.  Please
  see the property documentation for details.
* Fix a problem where environment variables in the registry which had no value
  were causing the Wrapper to crash with an access violation.  This was
  introduced in version 3.0.0 with the feature to load environment variables
  from the registry.  The offending registry entry was WV_GATEWAY_CFG which
  appears to be related to Oracle.

3.0.1
* Fix a problem with the wrapper.disable_shutdown_hook.  Due to a typo in the
  source, the property was being ignored.  This was broken in the 3.0.0
  release.
* Fix a problem with the HP-UX release build reported by Ashish Gawarikar.
* Add the ability to set environment variables from within the configuration
  file or from the command line.
* Fix a problem on HP-UX and AIX machines where the stop() function in the
  shell scripts was causing a syntax error due to a conflict with a like named
  shell command on those platforms.  This appears to be an issue with the
  Korn shell on all platforms.
* Fix a problem where very heavy output from the JVM can cause the Wrapper to
  give a false timeout.  The Wrapper now only reads 50 lines of input at a time
  to guarantee that the Wrapper's event loop always gets cycles.
* Fix a problem on UNIX versions where extra line breaks would sometimes be
  added to the logged output when there was large amounts of output being
  sent from the JVM.
* Fix a problem where a large number of calls to WrapperManager.log()
  immediately before the JVM exits could lead to the Wrapper incorrectly
  reporting that the JVM exited unexpectedly.

3.0.0
* Deprecated the com.silveregg.wrapper package in favor of
  org.tanukisoftware.wrapper.  The classes and interfaces in the silveregg
  package will continue to function, but migration to the new package should
  be done when possible. See the project history for details.
* On Windows systems change any forward slashes in the wrapper.java.command
  property to back slashes.  Some users had reported having problems on
  Windows XP.
* Implemented feature request #633178.  Added WrapperManager.requestThreadDump()
  to force the current JVM to immediately perform a thread dump.
* Fixed bug where wrapper.logfile.maxsize was being set to 0 if the 'k' or 'm'
  unit was omitted.
* Add the ability to specify an account name and password when installing an
  NT service.
* Add a property, wrapper.ntservice.interactive, which makes it possible to
  control whether or not the Java process can gain access to the desktop while
  it is running as an NT service.
* Add limited support for 1.2.x versions of Java.  Shutdown hooks are
  supported until Java 1.3 so those functions will be disabled.  If the
  application displays a GUI then Java 1.3 should be used as the GUI can not
  currently be displayed when using Java 1.2.x.
* Made it possible to use the wrapper.pidfile property on all *nix platforms.
  Please notice that the property has been removed from the default
  wrapper.conf file.  The property is not needed when the wrapper is launched
  with the bash shell script.  The sh shell script will set the wrapper.pidfile
  when the wrapper is launched.  If either of the scripts provided with the
  Wrapper distribution are used then the wrapper.pidfile should always be
  removed from your wrapper.conf file.
* Added a new wrapper.daemonize property which, when set, will form the wrapper
  process to be a detached non-session group leader.  This makes it possible to
  launch the wrapper in such a way that it will not be terminated when the user
  launching the process logs out.  This had been a problem on Solaris systems
  when using the sh shell.  The default sh and bash scripts both make use of
  this in the default.  Please update your scripts for use with this version.
  Thanks to Rajiv Subrahmanyam for the patch.
* Fix a problem where the Wrapper was incorrectly counting the number of
  non-daemon threads in BEA's JRockit Virtual Machine.  This was causing the
  application to shutdown when the non-daemon thread count dropped to 1.
* Added support for building the wrapper on AIX and HP-UX systems.  Thanks for
  the patches involved go out to Ashish Gawarikar and William Lee.
* Implement feature request #653131 to force the JVM to immediately exit when
  the user presses CTRL-C multiple times.
* Added a 'console' action to the bash and sh scripts to make it possible to
  launch the Wrapper in the current shell process.  The 'start' task will launch
  the Wrapper as a spawned daemon process.
* Fixed a problem where missing environment variables specified in classpath
  or library path properties were not being handled correctly.
* Implemented feature request #676599 to enable the filtering of JVM output to
  trigger JVM restarts or Wrapper shutdowns.  See the new
  wrapper.filter.trigger.n and wrapper.filter.action.n properties.
* Modify the Win32 version of the Wrapper so that Environment Variables are
  always read from the system registry when the Wrapper is run as a service.
  By doing this, it makes it possible to change or add the system environment
  variables and have them take effect without having to first reboot the
  machine.
* Implemented cascading configuration files.
* Changed the default value for the wrapper.java.initmemory property to be 3Mb.
  The default on Windows and Linux JVMs is 2Mb, but the Solaris JVM requires
  a minimum of 3Mb.  The minimum value accepted by the Wrapper was changed
  from 8Mb to 1Mb to make it possible to reduce the footprint of applications
  to what is possible without using the wrapper.
* Improve the parsing of configuration files so that leading and trailing white
  space is now correctly trimmed.  It is also now possible to have comments at
  the end of a line containing a property.
* Modify the way exceptions thrown by an application's main method are
  presented to the user by the WrapperSimpleApp and WrapperStartStopApp so
  they no longer look like a problem with Wrapper configuration.

2.2.9
* Added a new property, wrapperper.restart.delay, which allows the user to control
  the amount of time to pause between a JVM exiting and a new JVM being
  launched.
* Fixed bug #611024. The Wrapper would sometimes fail to start if
  wrapper.max_failed_invocations is set to 1.
* Fix a problem where the number of non-daemon threads was not being calculated
  in some cases.
* Implemented feature request #491443.  Environment variables referenced in the
  wrapper.conf file will now be evaluated as the file is loaded.  The windows
  syntax for environment variables is used on all platforms to make them
  platform independent.
* Fixed a problem where the wrapper.conf was being open with both read and
  write locks when a read lock is all that is needed.  Made the wrapper fail
  on startup if another application held a read lock on the conf file.
* Modified the message displayed when the native library could not be found,
  so that it is much more descriptive.  Hopefully it will cut down on questions
  caused by configuration problems.
* Implemented feature request #613539. Modified the wrapper.java.library.path
  to function like the wrapper.java.classpath.n properties so that multiple
  directories can be specified in the library path in a platform independent
  way.  The old property is still supported, but deprecated.
* Fix Bug #632215.  The WrapperManager.isLaunchedAsService() method was always
  returning false, even when run as a service under Windows.  On linux, the
  Wrapper is always run as a console app, so this method will always return
  false.
* Improve the message thrown when user code attempts to access System.in from
  within a JVM being controlled by the Wrapper.  System.in will not work
  because the JVM is a spawned process.

2.2.8
* Fixed a compiler problem on Solaris some systems.
* Added a new property, wrapper.cpu.timeout, which allows the user to control
  how much time without receiving any CPU the Wrapper will tolerate before
  displaying a warning message.  The CPU timeout feature was added in 2.2.7
  but the default timeout of 10 seconds was not configurable.
* The Wrapper was only allowing 5 seconds between the JVM informing the
  Wrapper that it was going to exit and the JVM process actually exiting.
  This would cause the Wrapper to terminate the process prematurely in
  cases where an application shutdown thread took longer than 5 seconds to
  complete.  The Wrapper not allows wrapper.jvm_exit.timeout seconds for
  the JVM process to exit on its own before being forcibly terminated.
* When there is a configuration problem or a resource is unavailable, a JVM
  will sometimes exit abnormally very shortly after being launched.  This
  can lead the the JVM being infinitely restarted due to a simple class
  path misconfiguration.  To work around this, the Wrapper has always had
  a hard limit of 5 restarts within a short period of time.  If the JVM
  has been running for more than a few minutes, then the count was reset.
  In this version, a new property. wrapper.max_failed_invocations was added
  to allow the max value to be set.   The time period which the JVM must
  now be running for the JVM launch to have been considered a success for
  restart purposes is set using the new wrapper.successful_invocation_time
  property.
* The number of advanced properties which most users do not need has been
  increasing as the Wrapper has been made more and more flexible.  This
  has been causing confusion in their usage by people who play with them
  without first reading the documentation.  To solve this, the advanced
  properties were removed from the default configuration file.  They still
  function.  But users must now read to the advanced configuration
  documentation to learn about their existence.  Added quite about to the
  descriptions of these properties to hopefully clear up any confusion
  about their usage.
* When the JVM exits abnormally, the Wrapper will pause for a few seconds
  before starting another JVM.  If the user pressed CTRL-C during this
  pause, a new JVM would still be launched.  The new JVM was exiting
  immediately but it was a waste of time.  The Wrapper now recognizes the
  event and aborts launching the new JVM.
* Added a page to the documentation which shows inline javadocs.  This
  will hopefully make it easier to navigate them as part of the full
  documentation set.
* Added a new method to the WrapperManager which enables user code to
  log at any log level.
* Added a new Helper class WrapperStartStopApp which allows users to easily
  integrate applications like Tomcat which use a separate class to stop
  the application.
* Added a samples section to the documentation.  Just includes Tomcat 4
  for now.

2.2.7
* Fix a problem where the JVM was trying to reconnect the Wrapper as it was
  being shutdown.  This was causing problems if the JVM was being restarted.
* Added support for the system being suspended to RAM or disk.  Also improved
  wrapper performance when a system is under 100% load.  See the new example
  output in the example section. 
* Fix a problem where the log output was not being directed to a file called
  wrapper.log in the same directory as the Wrapper binary in the event that the
  configured wrapper log file could not be accessed.
* Fix a problem where the Wrapper was not shutting down the JVM correctly when
  all non daemon threads completed.   Normally a JVM will exit when all of its
  non daemon threads have completed so this was causing some problems.
  (Thanks to Jung Tamas)
* Added the ability to set the priority of the Wrapper and its JVM when run
  as an NT service or console application.  The same thing can be better
  achieved on Unix systems by using "nice" in the shell script used to launch
  the Wrapper.  See the documentation for for details.
* JVM information was not being displayed correctly when the Wrapper native
  library could not be loaded.
* Added a new property to cause the wrapper to attempt to request a thread dump
  when the JVM does not exit on request.
* Improved the documentation of the WrapperSimpleApp and WrapperListener
  classes.
* Adding a new property wrapper.shutdown.timeout to allow the user to extend
  the length of time that an application is allowed to take shutting down.
* Rework the way the shutdown process works so that System.exit will never be
  called before the stop method in WrapperListener has had a chance to complete.
* Add a Restart button to the TestWrapper application.
* Fix a problem on Unix versions where '%' characters in Java output would
  sometimes cause the wrapper to crash.  Somehow missed getting this into the
  last release.
* Added a test to make sure that WrapperManager.stop is not called recursively.
* Added support for building under Windows XP.  Prebuilt installations had
  already been working. 

2.2.6
* Fix a problem where '%' characters in Java output would sometimes cause the
  wrapper to crash.  (Thanks to Frode Moe)
* Added support for requesting a Java thread dump without shutting down the
  Java process.
* Fixed a problem on windows where the java command was looking in the windows
  system and system32 directories for the java executable before checking the
  path when the full path to the java executable was not specified in the
  configuration file.  This could lead to different JVM being run from the
  Wrapper than was run if java -version was run from the command line.  The
  Wrapper will now attempt to resolve the full java path using the PATH
  environment variable.
* Added debug output showing Java version information when the JVM first
  starts.
* Modified c source to use /* */ style comments rather than // style comments.
  Some people were having problems with some compilers.

2.2.5
* Added support for service descriptions for Win2k and XP.
* Fixed bug issue when reading configuration files from Windows on Unix.
* Deprecated the wrapper.debug property in favor of loglevels.
* Added new logger functionality includes the following features:
  Loglevels like Log4j, NT Eventlog support, UNIX syslog support and rolling
  log files.
* Added wildcard support for classpath entries in wrapper.conf.
* Added the ability to specify configuration properties from the command line.
* Changed the way NT services are installed so that a patched version of the
  Wrapper.exe file no longer needs to be created to reference the
  wrapper.conf file.

2.2.4
* The value of APP_NAME in the bash or sh scripts no longer needs to be the
  same as the script.
* Added the ability to format and/or disable file logging and output to the
  console.
* Set mode of executables in binary release tar files so that they can be run
  without modification after being extracted.
* Fixed line feeds in release so that bat files are always CRLF, unix scripts
  are always LF.  Other source files are always CRLF in ZIP archives and LF
  in tar.gz archives.
* Make the build fail if Wrapper.exe or Wrapper.dll do not exist for Windows
  builds.
* Added an empty wrapper.log to the releases so that the TestWrapper example
  program runs out of the box.

2.2.3
* Added template scripts and conf files for ease of integration with other
  applications.
* Cleaned up the build.
* The WrapperSimpleApp method of launchine applications was not working 
  correctly with applications whose main method did not return.
* Add sample scripts and wrapper.conf files in the bin and lib directories.
  These scripts are used to start a sample application which runs out of the
  box.  See the new example.html page in the documentation for more details.
* Get rid of the platform specific directories in the bin and lib directories.
* Enable relative paths for Windows version.  In previous versions of Wrapper,
  it was necessary to always use absolute paths because the working directory 
  of the wrapper would be then NT System32 directory when run as a service.
* On the windows version, the wrapper always sets the current working
  directory to the location of the wrapper executable immediately after
  startup.
* Improvements to the documentation / web page.

2.2.2
* Added HTML based documentation.

2.2.1
* Added Linux and Solaris build files.
* Added Linux and Solaris documentation.

2.2.0
* Initial Public Release.

