所以这就是我做的 -
我将rt.jar的内容解压缩到一个名为rt的文件夹中.然后,在rt文件夹中,我执行了以下jar命令
jar cf rt.jar *
Run Code Online (Sandbox Code Playgroud)
这应该创建一个与原始rt.jar文件中的类相同的jar文件.
但是,这两个文件的文件大小明显不同.
Original rt.jar -> 43.1 MB
Newly created rt.jar -> 20.6 MB
Run Code Online (Sandbox Code Playgroud)
请注意,两个jar文件的解压缩内容的大小是相同的.这让我觉得原来的rt.jar不是用jar命令创建的.那是怎么创造的?
它可能是使用-0jar命令的选项创建的,它特别不应用ZIP压缩,而只是存储文件.
由于这个存档将被大量阅读,并且按现代标准来说它非常小,因此为了23MB,减少运行时开销似乎是值得的.
(无论如何,即使这不是严格正确的,文件大小的差异也会降低到不同的压缩级别.)
原始jar使用0压缩级别创建,以使加载类减少CPU密集度.
> unzip -v rt.jar
Archive: rt.jar
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
0 Stored 0 0% 02-03-2012 21:20 00000000 META-INF/
2343 Stored 2343 0% 02-03-2012 21:20 a653ef50 META-INF/MANIFEST.MF
754 Stored 754 0% 02-03-2012 21:12 fa8ba6d9 com/oracle/net/Sdp$1.class
350 Stored 350 0% 02-03-2012 21:12 ca729c09 com/oracle/net/Sdp$SdpSocket.class
...
Run Code Online (Sandbox Code Playgroud)