FileDocCategorySizeDatePackage
Pack200.javaAPI DocJava SE 6 API28313Tue Jun 10 00:25:58 BST 2008java.util.jar

Pack200

public abstract class Pack200 extends Object
Transforms a JAR file to or from a packed stream in Pack200 format. Please refer to Network Transfer Format JSR 200 Specification at http://jcp.org/aboutJava/communityprocess/review/jsr200/index.html

Typically the packer engine is used by application developers to deploy or host JAR files on a website. The unpacker engine is used by deployment applications to transform the byte-stream back to JAR format.

Here is an example using packer and unpacker:

import java.util.jar.Pack200;
import java.util.jar.Pack200.*;
...
// Create the Packer object
Packer packer = Pack200.newPacker();

// Initialize the state by setting the desired properties
Map p = packer.properties();
// take more time choosing codings for better compression
p.put(Packer.EFFORT, "7"); // default is "5"
// use largest-possible archive segments (>10% better compression).
p.put(Packer.SEGMENT_LIMIT, "-1");
// reorder files for better compression.
p.put(Packer.KEEP_FILE_ORDER, Packer.FALSE);
// smear modification times to a single value.
p.put(Packer.MODIFICATION_TIME, Packer.LATEST);
// ignore all JAR deflation requests,
// transmitting a single request to use "store" mode.
p.put(Packer.DEFLATE_HINT, Packer.FALSE);
// discard debug attributes
p.put(Packer.CODE_ATTRIBUTE_PFX+"LineNumberTable", Packer.STRIP);
// throw an error if an attribute is unrecognized
p.put(Packer.UNKNOWN_ATTRIBUTE, Packer.ERROR);
// pass one class file uncompressed:
p.put(Packer.PASS_FILE_PFX+0, "mutants/Rogue.class");
try {
JarFile jarFile = new JarFile("/tmp/testref.jar");
FileOutputStream fos = new FileOutputStream("/tmp/test.pack");
// Call the packer
packer.pack(jarFile, fos);
jarFile.close();
fos.close();

File f = new File("/tmp/test.pack");
FileOutputStream fostream = new FileOutputStream("/tmp/test.jar");
JarOutputStream jostream = new JarOutputStream(fostream);
Unpacker unpacker = Pack200.newUnpacker();
// Call the unpacker
unpacker.unpack(f, jostream);
// Must explicitly close the output.
jostream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}

A Pack200 file compressed with gzip can be hosted on HTTP/1.1 web servers. The deployment applications can use "Accept-Encoding=pack200-gzip". This indicates to the server that the client application desires a version of the file encoded with Pack200 and further compressed with gzip. Please refer to Java Deployment Guide for more details and techniques.

Unless otherwise noted, passing a null argument to a constructor or method in this class will cause a {@link NullPointerException} to be thrown.

author
John Rose
author
Kumar Srinivasan
version
1.16, 10/23/06
since
1.5

Fields Summary
private static final String
PACK_PROVIDER
private static final String
UNPACK_PROVIDER
private static Class
packerImpl
private static Class
unpackerImpl
Constructors Summary
private Pack200()

Methods Summary
private static synchronized java.lang.ObjectnewInstance(java.lang.String prop)


          
	String implName = "(unknown)";
	try {
	    Class impl = (prop == PACK_PROVIDER)? packerImpl: unpackerImpl;
	    if (impl == null) {
		// The first time, we must decide which class to use.
		implName = (String)
		    java.security.AccessController.doPrivileged
		    (new sun.security.action.GetPropertyAction(prop,""));
		if (implName != null && !implName.equals(""))
		    impl = Class.forName(implName);
		else if (prop == PACK_PROVIDER)
		    impl = com.sun.java.util.jar.pack.PackerImpl.class;
		else
		    impl = com.sun.java.util.jar.pack.UnpackerImpl.class;
	    }
	    // We have a class.  Now instantiate it.
	    return impl.newInstance();
	} catch (ClassNotFoundException e) {
	    throw new Error("Class not found: " + implName +
				":\ncheck property " + prop +
				" in your properties file.", e);
	} catch (InstantiationException e) {
	    throw new Error("Could not instantiate: " + implName +
				":\ncheck property " + prop +
				" in your properties file.", e);
	} catch (IllegalAccessException e) {
	    throw new Error("Cannot access class: " + implName +
				":\ncheck property " + prop +
				" in your properties file.", e);
	}
    
public static synchronized java.util.jar.Pack200$PackernewPacker()
Obtain new instance of a class that implements Packer.
  • If the system property java.util.jar.Pack200.Packer is defined, then the value is taken to be the fully-qualified name of a concrete implementation class, which must implement Packer. This class is loaded and instantiated. If this process fails then an unspecified error is thrown.

  • If an implementation has not been specified with the system property, then the system-default implementation class is instantiated, and the result is returned.

  • Note: The returned object is not guaranteed to operate correctly if multiple threads use it at the same time. A multi-threaded application should either allocate multiple packer engines, or else serialize use of one engine with a lock.

    return
    A newly allocated Packer engine.

    	return (Packer) newInstance(PACK_PROVIDER);
        
    public static java.util.jar.Pack200$UnpackernewUnpacker()
    Obtain new instance of a class that implements Unpacker.
  • If the system property java.util.jar.Pack200.Unpacker is defined, then the value is taken to be the fully-qualified name of a concrete implementation class, which must implement Unpacker. The class is loaded and instantiated. If this process fails then an unspecified error is thrown.

  • If an implementation has not been specified with the system property, then the system-default implementation class is instantiated, and the result is returned.

  • Note: The returned object is not guaranteed to operate correctly if multiple threads use it at the same time. A multi-threaded application should either allocate multiple unpacker engines, or else serialize use of one engine with a lock.

    return
    A newly allocated Unpacker engine.

    	return (Unpacker) newInstance(UNPACK_PROVIDER);