Maven打包后userAgents.txt未纳入Jar,运行报FileNotFoundException
解决Jar包中无法读取userAgents.txt的问题
问题根源
你当前用File类读取./src/main/resources/userAgents.txt的方式,仅在IDE运行时有效——因为IDE会把src/main/resources下的文件复制到编译输出目录(比如target/classes),此时文件存在于本地文件系统中。但打包成Jar后,资源文件是Jar包内部的一个条目,并非独立的文件系统文件,File类无法定位到它,因此抛出FileNotFoundException。
正确的资源读取方式
改用类加载器的getResourceAsStream方法读取Jar内的资源,这是读取类路径资源的标准方式:
基础实现
// 替换YourClassName为你的实际类名 InputStream inputStream = YourClassName.class.getClassLoader().getResourceAsStream("userAgents.txt"); if (inputStream == null) { throw new RuntimeException("未找到userAgents.txt资源"); } Scanner usrAgentReader = new Scanner(inputStream); // 读取逻辑示例 while (usrAgentReader.hasNextLine()) { String userAgent = usrAgentReader.nextLine(); // 处理User Agent } // 记得关闭资源 usrAgentReader.close(); inputStream.close();
推荐:使用try-with-resources自动关闭资源
避免手动关闭流时出现遗漏,推荐用Java的try-with-resources语法:
try (InputStream inputStream = YourClassName.class.getClassLoader().getResourceAsStream("userAgents.txt"); Scanner usrAgentReader = new Scanner(inputStream)) { if (inputStream == null) { throw new RuntimeException("userAgents.txt资源不存在"); } // 读取并处理每一行User Agent while (usrAgentReader.hasNextLine()) { String userAgent = usrAgentReader.nextLine(); // 你的业务逻辑 } } catch (IOException e) { e.printStackTrace(); }
Maven配置确认
默认情况下,Maven会自动将src/main/resources下的所有文件打包到Jar包的根目录,无需额外配置。如果之前手动配置了<resources>节点,确保配置正确(无需变量替换时关闭filtering):
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.txt</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
验证资源是否被打包
执行mvn clean package后,用以下命令检查Jar包内是否包含目标文件:
jar tf your-project.jar | grep userAgents.txt
如果输出包含userAgents.txt,说明资源已成功打包。
内容的提问来源于stack exchange,提问作者samsey8
相关产品推荐
相关产品推荐

