在 Ubuntu 上排查 Java 报错,可以按**“看现象 → 看日志 → 看环境 → 看代码/依赖”**的思路来。下面是一套比较通用的排查方法。
不要只看最后一行,要看完整 stack trace:
java -jar app.jar
或后台运行时:
journalctl -u your-service
cat logs/error.log
重点关注:
Exception in thread "main"Caused by:NoClassDefFoundErrorUnsupportedClassVersionErrorPermission deniedjava -version
javac -version
如果没有:
sudo apt update
sudo apt install openjdk-17-jdk
echo $JAVA_HOME
which java
如需设置:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
(可写入 ~/.bashrc 或 /etc/profile)
UnsupportedClassVersionError原因:编译版本高于运行版本
例:用 JDK 17 编译,用 JDK 8 运行
解决:
java -version
统一 JDK 版本,或重新用低版本编译。
NoClassDefFoundError / ClassNotFoundException原因:
排查:
jar tf app.jar | grep ClassName
运行指定 classpath:
java -cp "app.jar:lib/*" MainClass
Permission deniedchmod +x app.jar
或端口权限(如 80):
sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/lib/jvm/.../bin/java
sudo netstat -tunlp | grep 8080
sudo lsof -i:8080
报错:
java.lang.OutOfMemoryError
查看:
free -h
启动时限制:
java -Xms512m -Xmx1024m -jar app.jar
nohup java -jar app.jar > app.log 2>&1 &
或 systemd:
sudo journalctl -u your-app -f
jps
top -p <pid>
jstack <pid>
jmap -heap <pid>
如果你愿意,可以直接把完整报错贴出来,并告诉我:
我可以帮你精准定位原因。