[root@dabu.info ~]# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
[root@dabu.info ~]# cat > HelloWorld.java << 'EOF'
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World! This is a test code by nixCraft!");
}
}
EOF
[root@dabu.info ~]# javac HelloWorld.java
[root@dabu.info ~]# java HelloWorld
Hello, World! This is a test code by nixCraft!
java -jar <jar-file> [args...]
| 場景 | 命令示例 | 說明 |
|---|---|---|
| 當前目錄運行 | java -jar app.jar | 需包含 Main-Class 清單屬性 |
| 指定絕對路徑 | java -jar /opt/apps/myapp.jar | 生產環境推薦 |
| 傳遞程序參數 | java -jar app.jar arg1 arg2 | args[0]=arg1, args[1]=arg2 |
| 指定 JVM 參數 | java -Xms512m -Xmx2g -jar app.jar | 堆內存設置 |
| 指定配置文件 | java -jar app.jar --spring.config.location=file:/etc/app.yml | Spring Boot 外部配置 |
| 後台運行 | nohup java -jar app.jar > app.log 2>&1 & | 脫離終端運行 |
| 系統服務管理 | systemctl start myapp | 需編寫 .service 文件 |
可執行 JAR 必須在 META-INF/MANIFEST.MF 中包含:
Manifest-Version: 1.0
Main-Class: com.example.MainClass
Class-Path: lib/dependency1.jar lib/dependency2.jar
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
jar {
manifest {
attributes 'Main-Class': 'com.example.MainClass'
}
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
| 錯誤現象 | 可能原因 | 解決方案 |
|---|---|---|
no main manifest attribute | MANIFEST 缺少 Main-Class | 配置打包插件指定入口類 |
ClassNotFoundException | 依賴未打包/Class-Path 錯誤 | 用 Shade/FatJar 打包所有依賴 |
UnsupportedClassVersionError | JDK 版本不匹配 (如用 JDK 11 運行 JDK 17 編譯的類) | 統一編譯/運行 JDK 版本 |
| 端口衝突 | 默認 8080 被佔用 | 配置 server.port 或 -Dserver.port=8081 |
| 權限不足 | 綁定 1024 以下端口需 root | 用高端口或 setcap/authbind |
| 內存溢出 | 堆太小/內存洩漏 | 調大 -Xmx、分析 Heap Dump |
appuser 運行,禁用 root/opt/app/{jar,logs,config,data}/etc/systemd/system/app.serviceRollingFileAppender + logrotate/actuator/health-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xms2g -Xmx2g[Unit]
Description=My Java Application
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -Xms2g -Xmx2g -XX:+UseG1GC -jar app.jar
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
啟用:systemctl daemon-reload && systemctl enable --now app