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];
|