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

讓任意 JAR 變可執行:操作 Manifest 的 MakeJarRunnable 工具開發

     編輯:Java 相關知識

問題背景

可執行 JAR 需在 META-INF/MANIFEST.MF 中聲明 Main-Class。手工編輯格式嚴格、易出錯。利用 java.util.jar API 可程序化修改 Manifest,將任意 JAR 轉為可執行 JAR。

MakeJarRunnable 設計

三個參數

  1. 源 JAR 文件
  2. 主類全限定名(必須存在於 JAR 內)
  3. 輸出 JAR 文件名(避免覆蓋原文件)

核心代碼流程

// 1. 讀取源 JAR 及 Manifest
JarInputStream jarIn = new JarInputStream(new FileInputStream(args[0]));
Manifest manifest = jarIn.getManifest();
if (manifest == null) manifest = new Manifest();

// 2. 設置 Main-Class 屬性
Attributes attrs = manifest.getMainAttributes();
String old = attrs.putValue("Main-Class", args[1]);
if (old != null) {
    System.out.println("Warning: 原 Main-Class=" + old);
    System.exit(1);
}

// 3. 寫入新 JAR
JarOutputStream jarOut = new JarOutputStream(
    new FileOutputStream(args[2]), manifest);

byte[] buf = new byte[4096];
JarEntry entry;
while ((entry = jarIn.getNextJarEntry()) != null) {
    if ("META-INF/MANIFEST.MF".equals(entry.getName())) continue; // 跳過舊 Manifest
    jarOut.putNextEntry(entry);
    int read;
    while ((read = jarIn.read(buf)) != -1) {
        jarOut.write(buf, 0, read);
    }
    jarOut.closeEntry();
}
jarOut.flush(); jarOut.close(); jarIn.close();

使用示例

# 假設應用主類為 HelloRunnableWorld,原 JAR 為 myjar.jar
java MakeJarRunnable myjar.jar HelloRunnableWorld myjar_r.jar

# 執行新 JAR
java -jar myjar_r.jar

進階建議

  • 將 MakeJarRunnable 自身打包為可執行 JAR,隨時可用
  • 增加 -f 強制覆蓋參數、-v 顯示版本等 CLI 特性
  • 集成到構建腳本(Ant/Maven/Gradle)自動化發布流程

總結

JAR 規範賦予 Main-Class 屬性使 JAR 成為「一等公民」(可雙擊、可 java -jar)。本文工具利用標準 API 讓這一過程自動化、腳本化,消除手工編輯 Manifest 的痛點。

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