diff --git a/docs/index.html b/docs/index.html index fd631d840..fa117fe3e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1128,6 +1128,11 @@ attribute are just names, they do not contain any path information!

the directory from which to jar the files. Yes + + compress + Not only store data but also compress them, defaults to true + No + items a comma separated list of the files/directories to jar. All @@ -2039,6 +2044,11 @@ attribute are just names, they do not contain any path information!

the directory from which to zip the files. Yes + + compress + Not only store data but also compress them, defaults to true + No + items a comma separated list of the files/directories to zip. All diff --git a/src/main/org/apache/tools/ant/taskdefs/Jar.java b/src/main/org/apache/tools/ant/taskdefs/Jar.java index 564853fec..364cb59b4 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Jar.java +++ b/src/main/org/apache/tools/ant/taskdefs/Jar.java @@ -81,16 +81,19 @@ public class Jar extends Zip { protected void initZipOutputStream(ZipOutputStream zOut) throws IOException, BuildException { - zOut.setMethod(ZipOutputStream.DEFLATED); - // add manifest first if (manifest != null) { - ZipEntry ze = new ZipEntry("META-INF/"); - zOut.putNextEntry(ze); + super.zipDir(new File(manifest.getParent()), zOut, "META-INF/"); super.zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); } else { - ZipEntry ze = new ZipEntry("META-INF/"); - zOut.putNextEntry(ze); + /* + * We don't store directories at all and this one will cause a lot + * of problems with STORED Zip-Mode. + * + * That's why i've removed it -- Stefan Bodewig + */ + // ZipEntry ze = new ZipEntry("META-INF/"); + // zOut.putNextEntry(ze); String s = "/org/apache/tools/ant/defaultManifest.mf"; InputStream in = this.getClass().getResourceAsStream(s); if ( in == null ) @@ -105,8 +108,7 @@ public class Jar extends Zip { // First add directory to zip entry if(!vPath.equals("META-INF/")) { // we already added a META-INF - ZipEntry ze = new ZipEntry(vPath); - zOut.putNextEntry(ze); + super.zipDir(dir, zOut, vPath); } } diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java index 3fb60a872..ab0cc4b81 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Zip.java +++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java @@ -73,6 +73,7 @@ public class Zip extends MatchingTask { private File zipFile; private File baseDir; + private boolean doCompress = true; protected String archiveType = "zip"; /** @@ -91,6 +92,13 @@ public class Zip extends MatchingTask { baseDir = project.resolveFile(baseDirname); } + /** + * Sets whether we want to compress the files or only store them. + */ + public void setCompress(String compress) { + doCompress = Project.toBoolean(compress); + } + public void execute() throws BuildException { if (baseDir == null) { throw new BuildException("basedir attribute must be set!"); @@ -116,6 +124,11 @@ public class Zip extends MatchingTask { try { ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile)); + if (doCompress) { + zOut.setMethod(ZipOutputStream.DEFLATED); + } else { + zOut.setMethod(ZipOutputStream.STORED); + } initZipOutputStream(zOut); for (int i = 0; i < dirs.length; i++) { @@ -141,7 +154,6 @@ public class Zip extends MatchingTask { protected void initZipOutputStream(ZipOutputStream zOut) throws IOException, BuildException { - zOut.setMethod(ZipOutputStream.DEFLATED); } protected void zipDir(File dir, ZipOutputStream zOut, String vPath) @@ -153,6 +165,49 @@ public class Zip extends MatchingTask { throws IOException { ZipEntry ze = new ZipEntry(vPath); + + /* + * XXX ZipOutputStream.putEntry expects the ZipEntry to know its + * size and the CRC sum before you start writing the data when using + * STORED mode. + * + * This forces us to process the data twice. + * + * I couldn't find any documentation on this, just found out by try + * and error. + */ + if (!doCompress) { + long size = 0; + CRC32 cal = new CRC32(); + if (!in.markSupported()) { + // Store data into a byte[] + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + byte[] buffer = new byte[8 * 1024]; + int count = 0; + do { + size += count; + cal.update(buffer, 0, count); + bos.write(buffer, 0, count); + count = in.read(buffer, 0, buffer.length); + } while (count != -1); + in = new ByteArrayInputStream(bos.toByteArray()); + + } else { + in.mark(Integer.MAX_VALUE); + byte[] buffer = new byte[8 * 1024]; + int count = 0; + do { + size += count; + cal.update(buffer, 0, count); + count = in.read(buffer, 0, buffer.length); + } while (count != -1); + in.reset(); + } + ze.setSize(size); + ze.setCrc(cal.getValue()); + } + zOut.putNextEntry(ze); byte[] buffer = new byte[8 * 1024];