早期用戶容忍 1 分鐘下載只為看個動畫,但對於企業級 Applet(幾十個 .class 文件),每個文件都要建立一個 TCP 連接(三次握手、慢啟動、TLS 握手),連接開銷遠超數據傳輸時間。18 個類文件 = 18 次連接建立/斷開,嚴重拖慢首屏渲染。
將所有 .class、圖片、配置文件打包為單一歸檔文件,瀏覽器只需 1 次 HTTP 請求即可獲取全部資源。
| 格式 | 發起方 | HTML 參數 | 支持瀏覽器 | 壓縮建議 |
|---|---|---|---|---|
| JAR | Sun/JavaSoft (JDK 1.1+) | archive="app.jar" | 所有支持 Java Plugin 的瀏覽器 | 存儲模式或壓縮均可 |
| ZIP | Netscape | archive="app.zip" | Netscape 4+、Firefox、Chrome (Java Plugin) | 必須存儲模式(不壓縮) |
| CAB | Microsoft | <param name=cabbase value="app.cab"> | IE 4+ (需 ActiveX/Java VM) | Microsoft 自有壓縮 |
# PKZIP
pkzip -e0 app.zip *.class images/ config.properties
# Info-ZIP (Linux/Mac 常用)
zip -0 app.zip *.class images/ config.properties
# 參數 -0 = 零壓縮(存儲模式),數字 0 非字母 O
原理: Java 類加載器直接讀取 ZIP 內部條目,若壓縮需解壓再讀取,反而增加 CPU 開銷;存儲模式可直接映射字節碼。
# 需 Microsoft Cabinet SDK (cabarc.exe)
cabarc -r n app.cab *.class images\ config.properties
# 包含清單文件,指定主類
jar cvfm app.jar manifest.mf *.class images/ config.properties
# manifest.mf 內容
Main-Class: com.example.MainApplet
<applet name="Hello" code="HelloWorld" width="50" height="50"
codebase="https://cdn.example.com/applets/"
archive="hello.jar"> <!-- JAR:現代標準 -->
<param name="cabbase" value="hello.cab"> <!-- CAB:IE 兼容 -->
<!-- ZIP 由 archive 參數自動識別,Netscape 系優先使用 -->
</applet>
瀏覽器會按自身支持選擇最優格式:IE 用 CAB,Netscape 系用 ZIP,現代 Plugin 用 JAR。舊版瀏覽器自動退回逐個下載 .class。
JAR 不僅打包 .class,還可包含:
<applet archive="app.jar"> 會自動將 JAR 內資源暴露給 getResourceAsStream()、getImage()、getAudioClip() 等 API。
// 僅在需要時觸發類加載
public void actionPerformed(ActionEvent e) {
// 此時才會加載 HeavyDialog 及其依賴類
new HeavyDialog(this).setVisible(true);
}
將多個微小工具類(Util1、Util2...)合併為單一 Utils 類,減少類文件數量與常量池開銷。
# proguard.cfg
-injars app.jar
-outjars app-optimized.jar
-keep public class com.example.MainApplet
-keepclassmembers class * extends java.applet.Applet { *; }
-dontusemixedcaseclassnames # 避免大小寫衝突
可減少 30%-50% 字節碼體積,並移除未使用代碼。
| 方案 | 優勢 | 遷移成本 | 適用場景 |
|---|---|---|---|
| Java Web Start (JNLP) | 脫離瀏覽器、自動更新、沙箱安全 | 低(僅打包描述文件) | 內部桌面應用、Java 8 環境 |
| JavaFX + jlink | 原生打包、模塊化、無 JRE 依賴、GPU 加速 UI | 中(UI 重寫) | 新項目、長期維護桌面端 |
| Electron / Tauri + Web API | 前端生態、跨平台、無插件 | 高(全棧重寫) | 長期戰略、團隊前端強 |
| GraalVM Native Image | 毫秒級啟動、無 JIT 預熱、體積小 | 中(反射/動態代理需配置) | 微服務、CLI 工具、Serverless |
Applet 時代的加載優化本質是 「減少 HTTP 請求數」 與 「減小傳輸體積」,這正是現代 Web 性能優化(HTTP/2 多路復用、資源合併、Gzip/Brotli、Code Splitting、Tree Shaking)的雛形。理解 JAR/CAB/ZIP 的演進歷史,有助於我們在當前技術棧中做出更有歷史纵深的架構決策。