如何构建包含resources文件夹下外部文件的可执行Jar包
问题原因
打包成Jar文件后,资源文件是Jar包内部的压缩条目,不属于操作系统文件系统中的独立文件,你原有代码中使用File类读取资源路径的方式仅适用于本地未打包的开发环境,无法读取Jar包内的资源,因此会抛出FileNotFoundException。
解决方案
直接通过类或类加载器获取资源的输入流,无需走文件系统读取,修改后的代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Main main = new Main(); main.readFile("test.txt"); } public void readFile(String fileName){ // 直接获取资源输入流,适配Jar包内资源读取 try(Scanner scanner = new Scanner(getClass().getResourceAsStream("/" + fileName))){ while (scanner.hasNextLine()){ System.out.println(scanner.nextLine()); } }catch (Exception e){ e.printStackTrace(); } } }
额外注意事项
- 路径前缀
/表示从ClassPath根路径读取资源,对应你项目中resources目录下的根位置,如果你将文件放在resources的子目录中,需要补充对应路径,比如/config/test.txt。 - 打包完成后可以解压Jar包确认资源位置,确保
test.txt在Jar包的根目录下,如果Jar包内多了一层resources目录,说明你打包配置错误,需要调整IDEA的打包规则,将resources目录下的内容直接输出到Jar根目录,而不是把resources目录本身打包进去。 - 可提前判断输入流是否为null,避免资源不存在时抛出空指针异常。
内容的提问来源于stack exchange,提问作者Lin Sen
相关产品推荐
相关产品推荐

