JDK中藏匿的好工具pack200

Java5中带了一个压缩工具:Pack200,这个工具能对普通的jar文件进行高效压缩。其  实现原理是根据Java类特有的结构,合并常数  池,去掉无用信息等来实现对java类的高效压缩。由于是专门对Java类进行压缩的,所以对普通文件的压缩和普通压缩软件没有什么两样,但是对于Jar  文件却能轻易达到10-40%的压缩率。这在Java应用部署中很有用,尤其对于移动Java计算,能够大大减小代码下载量。
Java5中还提供了这一技术的API接口,你可以将其嵌入到你的程序中使用。使用的方法很简单,下面的短短几行代码即可以实现jar的压缩和解压:
压缩
Packer packer=Pack200.newPacker();
OutputStream output=new BufferedOutputStream(new  FileOutputStream(outfile));
packer.pack(new JarFile(jarFile), output);
output.close();
解压
Unpacker unpacker=Pack200.newUnpacker();
output=new JarOutputStream(new FileOutputStream(jarFile));
unpacker.unpack(pack200File, output);
output.close();
更为详细介绍,请见下面的网址:
http://java.sun.com/javase/6/docs/technotes/guides/deployment/deployment-guide/pack200.html
==================================================================================
     目前发布了一个swing 的程序,包括java web start 与applet  两个版本,但是由于第三方包的引入,发布包达到了近5MB,即使在局域网也让人无法忍受那缓慢的加载速度,毕竟对于绝大部分应用来说,网络带宽还是最终的 系统瓶颈。

还好JDK5在Java Web Start和Java Plug-in中提供了对gizp和pack200压 缩技术的支持,通过压缩将使Java的网络应用在jar的压缩基础上再一次的得到瘦身的飞跃。

gzip
jar包中包含的内容非Java类的资源文件比较多,例如JPEG, GIF等的,用gzip会比较合适

pack200
jar包绝大部分信息是class内容的话,那么pack200绝对是你的首选方案,因为pack200是专门针对class的java类进行优化设计的,主要体现在以下几个方面:

It merges and sorts the constant-pool data in the class files and  co-locates them in the archive. 
It removes redundant class attributes. 
It stores internal data structures. 
It use delta and variable length encoding. 
It chooses optimum coding types for secondary compression. 

压缩签名的整个发布过程

***/JDK5/bin/pack200 --repack demo.jar
--repack的作用等价与pack200和unpack200这两个指令,其作用是对demo.jar里面的class结构用Pack200的格式进行整理,因为签名需要根据jar包的类结构进行散列计算,所以如果不先进行jar 的Pack200格式整理的话,等签名后再用pack200进 行压缩将会导致签名无效,所以第一步需要进行--repack这个看似无用实则关键的操作 
jarsigner -keystore myKeystore demo.jar ...
对Pack200格式整理过的demo.jar进行签名 
***/JDK5/bin/pack200 demo.jar.pack.gz  demo.jar
对签完名的demo.jar进行Pack200压缩,生成demo.jar.pack.gz  

***/JDK5/sample/jnlp/servlet下面的jar包,主要是jnlp-servlet.jar拷贝到要发布的web工程的WEB- INF/lib/目录下 
修改web发布工程的web.xml文件,将所有*.jnlp和*.jar的url路径定位到 jnlp.sample.servlet.JnlpDownloadServlet进行处理 
将demo.jar、demo.jar.pack.gz拷贝到jnlp或者applet指定的路径下
通过以上的操作一切就ok了,也许你想问jnlp和applet需要做什么改动吗,答案是no,一切都由JnlpDownloadServlet  进行透明处理了,jnlp和applet里面的指向还是demo.jar,JnlpDownloadServlet自动会根据request的  Accept-Encoding决定到底是下发demo.jar.pack.gz还是demo.jar,这样如果客户端安装了JDK5的Java Web  Start或者Java Plug-in那么JnlpDownloadServlet自动会下发Pack200压 缩的demo.jar.pack.gz包,如果客户端是JDK1.4或者更老的环境,那么JnlpDownloadServlet自然会下发 demo.jar的普通包。 

Pack200的压缩和解压缩速度是比较快的,而且压缩率也是很惊人的,在我是使用  的包4.46MB压缩后成了1.44MB(0.322%),而且随着包的越大压缩率会根据明显,据说如果jar包都是class类可以压缩到1/9的大  小。其实JavaWebStart还有很多功能,例如可以按不同的jar包进行lazy下载和 单独更新,设置可以根据jar中的类变动进行class粒度的下载。心动不如行动,赶快去对 你的发布程序进行瘦身吧。

 

http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/downloadservletguide.html#example1

时间: 2024-11-01 20:06:46

JDK中藏匿的好工具pack200的相关文章

[转载]JDK自带VM分析工具jps,jstat,jmap,jconsole

一.概述      SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装)  .           我一共找到以下四个工具:重点看看jconsole和jmap. jps :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat :一个极强的监视VM内存工具.可以用来监视VM内存内的各种堆和非堆

Oracle 为标准化 JDK 中命令行选项作准备

Oracle公司Java SE语言工具团队领导Jonathan Gibbons创造了JEP 293,以引进一套JDK工具中的命令行选项准则来修复现有的它们之间存在的差异.JEP目前还没有目标版本,所以最快将会和Java 10一起交付.然而,考虑到它仅仅是为新的选项创造一套准则,而不是修改现有的选项,所以可能需要一段时间才能感受到它的效果. 正如在JEP中所述,JDK中不同的工具的命令行选项格式都不对齐.比如说,短的选项有时候只有一个字母(比如-p表示一个模块),但有时候又超过 一个字母(比如说现

Oracle为标准化JDK中命令行选项作准备

Oracle公司Java SE语言工具团队领导Jonathan Gibbons创造了JEP 293,以引进一套JDK工具中的命令行选项准则来修复现有的它们之间存在的差异.JEP目前还没有目标版本,所以最快将会和Java 10一起交付.然而,考虑到它仅仅是为新的选项创造一套准则,而不是修改现有的选项,所以可能需要一段时间才能感受到它的效果. 正如在JEP中所述,JDK中不同的工具的命令行选项格式都不对齐.比如说,短的选项有时候只有一个字母(比如-p表示一个模块),但有时候又超过一个字母(比如说现有

Java 9的JDK中值得期待的:不仅是模块化

[译者注]在本文中,作者介绍了即将在9.21发布的Java 9新特性,除了最重要的模块化以外,还涉及到编译,工具,协议,缓存等新特点,也提及了在此次版本中移除的功能,供Java爱好者阅读和参考. 以下为译文: 在多次延期后,Java 9将于9月21日以Java开发工具包9的形式出现,这是自2014年3月以来,Java标准版的第一次重大升级.官方列出了JDK 9的大约90个新特性,模块化是最主要的一个.将Java重新配置成模块化格式,这项任务已经持续了多年,但在编译.代码缓存和JavaScript

JDK中常用包及其类和功能详细剖析

JDK所提供的所有标准Java类都存放在Java包中,如java.lang包中包含了运行Java必不可少的系统类.由于系统会自动将java.lang引入,所以不需要在源文件中用import语句来显示地引入这个包.另外,Java跪地过java.util和java.io是必须提供的标准包,在JDK中常用的包有以下几种: 1.java.lang:语言包 2.java.util:实用包 3.java.awt:抽象窗口工具包 4.javax.swing:轻量级的窗口工具包,这是目前使用最广泛的GUI程序设

Java Web Start学习,与JDK中keytool常用命令

Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它获去年全球Java技术最佳创意奖.它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护.这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端,也不用去考虑版本升级后对客户端的维护,这就是JWS提供给我们的好处之一.OK,下面我们就来看看如何玩转

jdk中String类设计成final的原由_java

最佳答案: 主要是为了 " 效率 " 和 " 安全性 " 的缘故. 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final. 其它答案一: String 和其他基本类型不同 , 他是个对象类型. 既然是对象类型 , 如果是在静态方法下是必须调用静态方法或值的 , 如果是非静态的方法 , 就必须要实例化. main 函数是个 static 的. 所以 String 要能像其他的基本类型一样直接被调用. 这

VB外接程序的制做-在VB中创建您自己工具条和菜单

菜单|程序|创建|工具条 VB外接程序的制做二,在VB中创建您自己工具条和菜单 创建工具条依然需要使用到VBI,只要和VB打交道,必须有它,同时在上篇文章所阐述的菜单项的制做方法是对你现在即将做的工作有用的.有一点你必须知道,无论是创建按钮,还是创建菜单项,他们之间是没有区别的.只是有一些地方有一点点不同而已. 怎样创建工具条呢?非常简单. VBI.CommandBars.Add cbsToolsBarName 此方法后面当然有其它可选参数,但是有些东西对于现在我要阐述的问题是无关的. Func

如何在Word 2013中使用格式刷工具

Word2013中的格式刷工具可以将特定文本的格式复制到其他文本中,当用户需要为不同文本重复设置相同格式时,即可使用格式刷工具提高工作效率,操作步骤如下所述: 第1步,打开Word2013文档窗口,并选中已经设置好格式的文本块.在"开始"功能区的"剪贴板"分组中双击"格式刷"按钮,如图2013080207所示. 图2013080207 双击"格式刷"按钮 Word Home提示:如果单击"格式刷"按钮,则格