diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 8d24cbed0759f8fcd8f6d9f15d78d53e1d4c505d..481fa468712fc9e6fbe919c87727145a76750118 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -441,7 +441,7 @@ public class ClassicPluginStrategy implements PluginStrategy { * Repackage classes directory into a jar file to make it remoting friendly. * The remoting layer can cache jar files but not class files. */ - private static void createClassJarFromWebInfClasses(File archive, File destDir, Project prj) { + private static void createClassJarFromWebInfClasses(File archive, File destDir, Project prj) throws IOException { File classesJar = new File(destDir, "WEB-INF/lib/classes.jar"); ZipFileSet zfs = new ZipFileSet(); @@ -458,31 +458,36 @@ public class ClassicPluginStrategy implements PluginStrategy { mapper.add(gm); final long dirTime = archive.lastModified(); - Zip z = new Zip() { - /** - * Forces the fixed timestamp for directories to make sure - * classes.jar always get a consistent checksum. - */ - protected void zipDir(Resource dir, ZipOutputStream zOut, String vPath, - int mode, ZipExtraField[] extra) - throws IOException { - - ZipOutputStream wrapped = new ZipOutputStream(new NullOutputStream()) { - @Override - public void putNextEntry(ZipEntry ze) throws IOException { - ze.setTime(dirTime+1999); // roundup - super.putNextEntry(ze); - } - }; - super.zipDir(dir,wrapped,vPath,mode,extra); + // this ZipOutputStream is reused and not created for each directory + final ZipOutputStream wrappedZOut = new ZipOutputStream(new NullOutputStream()) { + @Override + public void putNextEntry(ZipEntry ze) throws IOException { + ze.setTime(dirTime+1999); // roundup + super.putNextEntry(ze); } }; - z.setProject(prj); - z.setTaskType("zip"); - classesJar.getParentFile().mkdirs(); - z.setDestFile(classesJar); - z.add(mapper); - z.execute(); + try { + Zip z = new Zip() { + /** + * Forces the fixed timestamp for directories to make sure + * classes.jar always get a consistent checksum. + */ + protected void zipDir(Resource dir, ZipOutputStream zOut, String vPath, + int mode, ZipExtraField[] extra) + throws IOException { + // use wrappedZOut instead of zOut + super.zipDir(dir,wrappedZOut,vPath,mode,extra); + } + }; + z.setProject(prj); + z.setTaskType("zip"); + classesJar.getParentFile().mkdirs(); + z.setDestFile(classesJar); + z.add(mapper); + z.execute(); + } finally { + wrappedZOut.close(); + } } private static void unzipExceptClasses(File archive, File destDir, Project prj) { diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 61bf466600f92338e8957360bcaaab76e0d1a71e..b2564edc70afb7de07ef5e418dd62ce1ee16e256 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -530,7 +530,12 @@ public final class FilePath implements Serializable { if (p != null) { p.mkdirs(); } - IOUtils.copy(zip.getInputStream(e), f); + InputStream input = zip.getInputStream(e); + try { + IOUtils.copy(input, f); + } finally { + input.close(); + } try { FilePath target = new FilePath(f); int mode = e.getUnixMode();