在 Ubuntu 上运行 Java 程序时常见的“权限错误”一般不是 Java 语言本身的问题,而是 Linux 文件/目录权限、用户身份或安全机制 导致的。下面按常见原因给你梳理一下。
报错示例:
Permission denied
java.lang.RuntimeException: Unable to access jarfile xxx.jar
原因:
.jar 文件没有读权限解决方法:
chmod +x yourapp.jar
chmod +r yourapp.jar
或运行:
java -jar yourapp.jar
场景:
sudo java -jar app.jar
但 app.jar 是普通用户创建的
问题:
解决:
sudo chown root:root app.jar
或不要用 root 跑 Java(推荐)
报错:
java.net.BindException: Permission denied
原因: Linux 规定 只有 root 能绑定 1024 以下端口
解决方案:
setcap:sudo setcap CAP_NET_BIND_SERVICE=+eip $(readlink -f $(which java))
例如:
/var/log/dev/tty/dev/ttyS0解决:
sudo usermod -aG dialout $USER
sudo chmod 666 /dev/ttyS0
如果你用 systemd 启 Java:
[Service]
User=appuser
但:
解决:
mkdir -p /var/log/myapp
chown -R appuser:appuser /var/log/myapp
虽然 Ubuntu 默认 AppArmor 不严,但某些 Java 行为可能被拦。
排查:
sudo dmesg | grep apparmor
Java 默认用 /tmp
报错:
java.io.IOException: Permission denied
解决:
java -Djava.io.tmpdir=/home/user/tmp -jar app.jar
java -jar app.jar 2>&1 | less
whoami
ls -l app.jar
netstat -tulnp
你可以直接把 完整报错信息 或 运行命令 发出来,例如:
java -jar xxx.jar 的完整错误sudojava -version)我可以帮你精准定位是哪一类权限问题。