Cannot Undeploy Or Redeploy Application With Open
Streams to Jar Files (Windows Only)

Description

On Windows systems, after running an application, subsequent attempts
to undeploy it or redeploy it throw exceptions about the server being unable
to delete a file or rename a directory.

On Windows systems, an application may use getClass().getResource or getResourceAsStream methods to locate a resource inside the application,
particularly in jar files that are in the application or
accessible to it. If the streams remain open, subsequent attempts to redeploy
or undeploy the application can fail. In addition, the Java runtime by default
caches streams to jar files for performance reasons.

Solution

Be sure to close streams opened by your applications. Also, if an application
needs to be redeployed or undeployed repeatedly, and also needs to obtain
a resource from a jar file using getResource or getResourceAsStream, consider using getClass().getResource which
returns a URL object, then invoke the url.setUseCaches method
to turn off caching for that jar file, and then use url.getInputStream() to obtain the stream.

Although turning off caching for accesses to the jar file
can slow down performance, this approach does allow the application to be
undeployed or redeployed. Note also that if the getClass().getResourceAsStream method is used instead, then the jar file in
which the resource is located will be cached (this is the default Java runtime
setting) and remain open until the server is stopped.