Windows 下常見 .exe 自解壓包(WinZip Self-Extractor),但僅限 Windows。JAR 自解壓包**只要有 JRE 1.2+ 即可在任何平台運行**(Linux、Solaris、macOS 等),真正實現「一次打包,到處解壓」。
META-INF/MANIFEST.MF 指定主類Main-Class: ZipSelfExtractorZipSelfExtractor.java(含 main()、解壓邏輯、GUI 選擇目錄)private String getJarFileName() {
myClassName = this.getClass().getName() + ".class";
URL urlJar = this.getClass().getClassLoader().getSystemResource(myClassName);
String urlStr = urlJar.toString(); // jar:file:/home/test/zipper.jar!/ZipSelfExtractor.class
int from = "jar:file:".length();
int to = urlStr.indexOf("!/");
return urlStr.substring(from, to); // /home/test/zipper.jar
}
用 getSystemResource(類名.class) 而非硬編碼類名,支持重命名解壓器類無需改代碼。
JFileChooser 選擇目標目錄(DIRECTORIES_ONLY 模式)META-INF/MANIFEST.MF 與自身 .classProgressMonitor 顯示進度,支持取消# 1. 準備原始內容 ZIP
zip -r Myzip.zip content_dir
# 2. 獲取 zipper.jar(含 ZipSelfExtractor.class、jarmanifest)
java -jar zipper.jar # 會自動解壓出這兩個文件
# 3. 重命名/整理
cp zipper.class ZipSelfExtractor.class
mv Myzip.zip myzip.jar
# 4. 替換 JAR 內容為 manifest + 解壓器
jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class
# 5. 測試
java -jar myzip.jar
/* ZipSelfExtractor.java */
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.util.zip.*;
import java.util.*;
import java.text.*;
public class ZipSelfExtractor extends JFrame {
private String myClassName;
static String MANIFEST = "META-INF/MANIFEST.MF";
public static void main(String[] args) {
ZipSelfExtractor zse = new ZipSelfExtractor();
String jarFileName = zse.getJarFileName();
zse.extract(jarFileName);
System.exit(0);
}
ZipSelfExtractor() { }
private String getJarFileName() { ... } // 見上文
public void extract(String zipfile) { ... } // 完整解壓邏輯含 GUI、衝突處理、進度條
}
完整源碼見原文附件,含異常處理、資源關閉、跨平台路徑處理等工程化細節。
自解壓 JAR 結合 Java 跨平台特性與 JAR 封裝優勢,僅需 Main-Class、解壓器類、原始內容三要素,構建極簡發布包。適用於安裝程序、補丁分發、離線數據包等場景。