pack200.exe 是 Java5 中引入的一个工具,它能对普通的 JAR 文件进行高效压缩。其实现原理是根据 Java 类特有的结构,合并常数池、去掉无用信息等来实现对 Java 类的高效压缩。
如果 JAR 包绝大部分信息是 class 内容,使用 pack200.exe 进行压缩能轻易达到 10%-40% 的压缩率,这在 Java 应用部署中很有用,尤其对于移动 Java 计算,能够大大减小代码下载量。
pack200 [-opt... | --option=value]... x.pack[.gz] y.jar
该命令的打包选项如下
-g, --no-gzip 输出无格式的 *.pack 文件, 不压缩
--gzip (默认值) 使用 gzip 对打包进行后处理
-G, --strip-debug 打包时删除调试属性
-O, --no-keep-file-order 不传输文件排序信息
--keep-file-order (默认值) 保留输入文件排序
-S{N}, --segment-limit={N} 输出段限制 (默认值 N=1Mb)
-E{N}, --effort={N} 打包效果 (默认值 N=5)
-H{h}, --deflate-hint={h} 传输压缩提示: true, false 或 keep (默认值)
-m{V}, --modification-time={V} 传输 modtimes: latest 或 keep (默认值)
-P{F}, --pass-file={F} 传输未解压缩的给定输入元素
-U{a}, --unknown-attribute={a} 未知属性操作: error, strip 或 pass (默认值)
-C{N}={L}, --class-attribute={N}={L} (用户定义的属性)
-F{N}={L}, --field-attribute={N}={L} (用户定义的属性)
-M{N}={L}, --method-attribute={N}={L} (用户定义的属性)
-D{N}={L}, --code-attribute={N}={L} (用户定义的属性)
-f{F}, --config-file={F} 读取文件 F 的 Pack200.Packer 属性
-v, --verbose 提高程序详细程度
-q, --quiet 将详细程度设置为最低级别
-l{F}, --log-file={F} 输出到给定日志文件, 或对于 System.out 指定 '-'
-?, -h, --help 输出此消息
-V, --version 输出程序版本
-J{X} 将选项 X 传递给基础 Java VM
注:
-P, -C, -F, -M 和 -D 选项累计。
示例属性定义: -C SourceFile=RUH。
Config. 文件属性由 Pack200 API 定义。
有关 -S, -E, -H-, -m, -U 值的含义, 请参阅 Pack200 API。
布局定义 (例如 RUH) 由 JSR 200 定义。
重新打包模式通过打包/解包周期更新 JAR 文件:
pack200 [-r|--repack] [-opt | --option=value]... [repackedy.jar] y.jar
(1)压缩 JAR 文件为 pack200 格式,如下:
pack200 commons-lang3-3.4.pack.gz commons-lang3-3.4.jar
上面命令将 commons-lang3-3.4.jar 文件压缩为 commons-lang3-3.4.pack.gz,如下图:
(2)使用 Java 代码实现 pack200 的压缩功能,例如:
package com.hxstrive.pack200; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.jar.JarFile; import java.util.jar.Pack200; /** * Pack200 压缩 * @author hxstrive.com */ public class Pack200Demo { public static void main(String[] args) throws Exception { OutputStream output = null; try { Pack200.Packer packer = Pack200.newPacker(); output = new BufferedOutputStream(new FileOutputStream("E:\\commons-lang3-3.4.pack.gz")); packer.pack(new JarFile("E:\\commons-lang3-3.4.jar"), output); } finally { if(null != output) { output.close(); } } } }
注意事项:
(1)请确保你的 JDK 版本包含 pack200 工具,因为该工具可能在某些版本的 JDK 中已被弃用或删除。
(2)由于 pack200 和 unpack200 已被弃用,如果你正在开发一个长期维护的项目,建议寻找其他替代方案来压缩和解压 JAR 文件。
(3)在使用 pack200 时,请注意它的压缩效果可能因 JAR 文件的内容和结构而异。