openSuse系统双击运行jar文件报java.io.FileNotFoundException错误如何解决
问题根因
- 你代码里用了相对路径读取配置文件,
new File("configs/configs.json")的路径是相对于Java进程的当前工作目录,而非jar文件本身的存放目录 - 命令行用root运行时你通常会先cd到jar所在目录,当前工作目录匹配,自然能找到配置文件;双击启动时系统默认的工作目录一般是用户家目录(/home/你的用户名),和jar所在目录不一致,就会报找不到文件
- 额外排查点:如果jar和configs目录存放在需要root权限才能读的路径(比如/opt、/root目录下),普通用户双击运行时权限不足也会触发这个报错
解决方案
方案1:修改代码,固定从jar所在目录读取配置(推荐,一劳永逸)
把读取配置的代码替换成下面的逻辑,先获取jar本身的存放路径,再拼接配置文件路径:
// 获取jar包所在的目录路径 String jarPath = new File(YourMainClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent(); // 拼接配置文件的绝对路径 File f = new File(jarPath + File.separator + "configs" + File.separator + "configs.json"); FileReader file = new FileReader(f);
注意把YourMainClass替换成你项目里主启动类的类名,注:这段代码在IDE开发环境下运行时可能返回项目编译目录,打包为jar后运行会正常返回jar所在目录。
方案2:不修改代码,修改双击启动的启动脚本
如果不想改代码,你可以给jar包写一个启动脚本,指定工作目录后再启动jar:
- 在jar所在目录新建
启动.sh文件,内容如下:
#!/bin/bash # 切换到脚本所在目录(也就是jar所在目录) cd "$(dirname "$0")" java -jar 你的jar包名字.jar
- 给脚本加可执行权限:右键属性→权限→勾选允许作为程序执行,或者终端运行
chmod +x 启动.sh - 之后双击这个
启动.sh就可以正常启动应用
- 如果openSuse默认双击sh文件打开文本编辑器,可打开文件管理器→设置→偏好设置→行为,把“可执行文本文件”的选项调整为“运行”或“询问是否运行”即可。
方案3:权限问题的修复
如果是因为jar和configs存放在有权限限制的目录:
- 把jar和整个configs目录移动到你普通用户的家目录下,比如
/home/你的用户名/app/,确保你当前登录的用户对整个目录有读、执行权限 - 或者终端执行
sudo chmod -R 755 你的jar所在目录给所有用户放开读执行权限
内容的提问来源于stack exchange,提问作者Mr. ATC
相关产品推荐
相关产品推荐

