NetBeans远程运行树莓派程序:JAR内文件存在却提示找不到
排查NetBeans远程部署树莓派时Jar内资源文件找不到的问题
我之前也碰到过类似的远程部署后Jar包内资源无法读取的坑,结合你的情况,咱们一步步来定位问题:
检查资源文件的读取方式是否错误
很多人会犯的一个错是用File类去读取Jar包内的资源,这在Jar外部运行没问题,但Jar内部的资源并不是真实的文件系统路径,所以会报“找不到文件”。比如你可能写了类似这样的代码:File geoFile = new File(getClass().getResource("/files/GeoLiteCity.dat").getPath());这种方式在Jar里完全不适用,正确的做法是用
getResourceAsStream来读取:InputStream is = getClass().getResourceAsStream("/files/GeoLiteCity.dat"); // 然后用InputStream来操作文件内容,比如加载到你的GeoIP库中验证树莓派上的Jar包是否完整包含资源
虽然你本地Jar里有这个文件,但远程部署可能出了问题,导致树莓派上的Jar是旧的或者不完整的。你可以登录树莓派,执行以下命令检查Jar内的结构:unzip -l /home/pi/NetBeansProjects/ExampleProject/dist/ExampleProject.jar | grep GeoLiteCity.dat注意Linux系统大小写敏感!如果你的代码里写的是
Files/GeoLiteCity.dat但Jar里实际是files/GeoLiteCity.dat,也会找不到。确认NetBeans部署配置是否正确
有时候NetBeans的部署任务会缓存旧的构建产物,或者上传过程中出现中断。你可以手动把本地dist目录下的ExampleProject.jar用SCP或者FTP传到树莓派的对应目录,覆盖掉原来的文件,然后再重新运行程序试试。检查资源路径的写法是否正确
调用getResource或getResourceAsStream时,路径开头的斜杠很重要:- 带斜杠
/files/GeoLiteCity.dat:表示从Jar的根目录开始找 - 不带斜杠
files/GeoLiteCity.dat:表示从当前类所在的包路径下找
如果你代码里的路径少了斜杠,而files目录不在当前类的包下,自然就找不到了。
- 带斜杠
内容的提问来源于stack exchange,提问作者Alexander Jeitler-Stehr
相关产品推荐
相关产品推荐

