首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

製作跨平台自解壓 JAR 文件:原理、工具鏈與源碼全解析

     編輯:Java 相關知識

自解壓 JAR 的價值

Windows 下常見 .exe 自解壓包(WinZip Self-Extractor),但僅限 Windows。JAR 自解壓包**只要有 JRE 1.2+ 即可在任何平台運行**(Linux、Solaris、macOS 等),真正實現「一次打包,到處解壓」。

三大核心組件

  1. Manifest 文件:META-INF/MANIFEST.MF 指定主類
    Main-Class: ZipSelfExtractor
  2. 解壓器類:ZipSelfExtractor.java(含 main()、解壓邏輯、GUI 選擇目錄)
  3. 原始內容 JAR/ZIP:待解壓的業務文件

關鍵技巧:獲取自身 JAR 文件路徑

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) 而非硬編碼類名,支持重命名解壓器類無需改代碼。

解壓流程

  1. 彈出 JFileChooser 選擇目標目錄(DIRECTORIES_ONLY 模式)
  2. 遍歷 JAR 條目,跳過 META-INF/MANIFEST.MF 與自身 .class
  3. 文件衝突時彈出對話框:Yes / Yes To All / No
  4. ProgressMonitor 顯示進度,支持取消
  5. 解壓完成提示音 + 信息彈窗

打包步驟(命令行)

# 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)

/* 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、解壓器類、原始內容三要素,構建極簡發布包。適用於安裝程序、補丁分發、離線數據包等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved