Java 應用編譯後產生一堆 .class 文件,運行時需設置 classpath、輸入 java 全限定類名,對用戶不友好。可執行 JAR 封裝所有依賴與啟動信息,用戶雙擊或 java -jar app.jar 即可運行,保留跨平台特性。
JAR 本質是 ZIP 格式,唯一區別在於包含 META-INF/MANIFEST.MF 清單文件。
test.jar
├── META-INF/
│ └── MANIFEST.MF ← 關鍵:指定 Main-Class
└── test/
└── Test.class
manifest.mf(注意最後必須有換行):
Main-Class: test.Test
├── manifest.mf
└── test/
└── Test.class
jar cvfm test.jar manifest.mf test
c 創建、v 顯示過程、f 指定輸出文件、m 引入清單文件java -jar test.jar
test/Test.class)。test.Test)。java test.Test 在 classpath 正確時能跑通。.jar 關聯 javaw.exe,無控制台窗口;需控制台用 java -jar。<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 含依賴的 fat-jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } // fat-jar
}
掌握手動 jar cvfm 命令是理解 JAR 機制的基礎;實際項目中強烈建議用構建工具自動化生成 Fat JAR,簡化部署與分發。