可執行 JAR 需在 META-INF/MANIFEST.MF 中聲明 Main-Class。手工編輯格式嚴格、易出錯。利用 java.util.jar API 可程序化修改 Manifest,將任意 JAR 轉為可執行 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 特性JAR 規範賦予 Main-Class 屬性使 JAR 成為「一等公民」(可雙擊、可 java -jar)。本文工具利用標準 API 讓這一過程自動化、腳本化,消除手工編輯 Manifest 的痛點。