Browse Source

Added a "compress" attribute to the Zip and Jar task.

Submitted by:	Stefan Bodewig (bodewig@bost.de)


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267665 13f79535-47bb-0310-9956-ffa450edef68
master
Arnout J. Kuiper 25 years ago
parent
commit
d180ff4e65
3 changed files with 76 additions and 9 deletions
  1. +10
    -0
      docs/index.html
  2. +10
    -8
      src/main/org/apache/tools/ant/taskdefs/Jar.java
  3. +56
    -1
      src/main/org/apache/tools/ant/taskdefs/Zip.java

+ 10
- 0
docs/index.html View File

@@ -1128,6 +1128,11 @@ attribute are just names, they do not contain any path information!</p>
<td valign="top">the directory from which to jar the files.</td>
<td valign="top" align="center">Yes</td>
</tr>
<tr>
<td valign="top">compress</td>
<td valign="top">Not only store data but also compress them, defaults to true</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">items</td>
<td valign="top">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!</p>
<td valign="top">the directory from which to zip the files.</td>
<td align="center" valign="top">Yes</td>
</tr>
<tr>
<td valign="top">compress</td>
<td valign="top">Not only store data but also compress them, defaults to true</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">items</td>
<td valign="top">a comma separated list of the files/directories to zip. All


+ 10
- 8
src/main/org/apache/tools/ant/taskdefs/Jar.java View File

@@ -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);
}
}



+ 56
- 1
src/main/org/apache/tools/ant/taskdefs/Zip.java View File

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


Loading…
Cancel
Save