| 特性 | java -jar app.jar | java -cp app.jar com.example.Main |
|---|---|---|
| 入口點 | MANIFEST.MF 中 Main-Class 屬性 | 命令行顯式指定全限定類名 |
| Classpath | 忽略外部 -cp/-classpath,僅用 JAR 內 Class-Path | 完全由 -cp 控制,可混合多個 JAR/目錄 |
| 多 Main 類支援 | 單一固定入口 | 可任意指定任意含 main 方法的類 |
| 適用場景 | 標準發布、生產部署 | 測試、多入口工具、調試特定類 |
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Application</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.Application</mainClass>
<layout>ZIP</layout> <!-- 或 JAR -->
</configuration>
<executions>
<execution>
<goals><goal>repackage</goal></goals>
</execution>
</executions>
</plugin>
啟動:java -jar myapp.jar 或 java -jar myapp.jar --spring.profiles.active=prod
# 基本語法
java -cp target/myapp.jar com.example.tools.DataMigration arg1 arg2
# 包含依賴(需手動展開或使用 classpath 通配符 Java 6+)
java -cp "target/myapp.jar:target/lib/*" com.example.tools.BatchJob
# Windows 路徑分隔符為分號
java -cp "target/myapp.jar;target/lib/*" com.example.tools.BatchJob
OneJar 將依賴包嵌套在 JAR 內部,類加載器特殊,無法直接用 -cp 指定主類。必須使用 java -jar 或解壓後重新組織 classpath。
#!/bin/bash
# list-mains.sh:掃描 JAR 內所有含 main 方法的類
JAR_FILE=$1
unzip -q -c "$JAR_FILE" META-INF/MANIFEST.MF 2>/dev/null | grep -i main-class || true
# 使用 javap 反編譯查找(較慢但準確)
unzip -l "$JAR_FILE" | grep '\.class$' | awk '{print $4}' | sed 's/\.class$//; s/\//./g' | \
while read class; do
if unzip -p "$JAR_FILE" "${class//./\/}.class" | javap -c - | grep -q "main.*String\[\]"; then
echo "$class"
fi
done
maven-jar-plugin 或 spring-boot-maven-plugin 固化 Main-Class,啟動腳本只需 java -jar app.jar $ARGS。-cp 顯式指定主類,避免修改 MANIFEST。java -jar app.jar --server.port=8081(Spring Boot)或 java -cp app.jar com.Main arg1 arg2(原生 args 數組)。--module/-m 啟動,而非 -jar/-cp。no main manifest attribute:JAR 未設置 Main-Class,用 -cp 指定或重新打包。ClassNotFoundException:-cp 路徑缺少依賴 JAR,檢查 Class-Path 或展開 fat-jar。Error: Could not find or load main class:類名拼寫錯誤、包名不匹配、或模塊化項目用法錯誤。