Maven命令行运行项目时触发java.io.FileNotFoundException异常
解决Maven命令行执行时Excel文件找不到的问题
核心原因
Eclipse默认工作目录是项目根目录,但Maven命令行执行时,默认工作目录是你执行mvn命令所在的路径(如果是多模块项目,子模块下执行命令的话工作目录是子模块根目录);另外直接用文件名读取时,Eclipse和Maven的路径解析逻辑也存在差异。
解决方案
1. 用类加载器读取资源目录文件
把Excel文件放到src/main/resources目录下,Maven打包时会自动将该目录下的文件复制到target/classes中,代码通过类加载器读取,彻底规避路径问题:
// 读取resources下的Excel文件 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
这种方式不管是Eclipse运行还是Maven命令行执行,都能从classpath中正确加载文件。
2. 确认Maven执行的工作目录
执行mvn命令前,先通过pwd(Linux/macOS)或cd(Windows)确认当前工作目录,然后将Excel文件放到该目录下,或者在代码中使用相对路径指向文件:
比如你在项目根目录执行命令,文件放在根目录,代码里直接写new File("test.xlsx")即可;如果在子模块目录执行,文件在父项目根目录,就用new File("../test.xlsx")。
3. 配置Maven exec插件指定工作目录
如果需要固定工作目录,可在pom.xml的exec-maven-plugin中配置workingDirectory,强制命令行执行时的工作目录为项目根目录:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>com.yourpackage.YourMainClass</mainClass> <!-- 指定工作目录为项目根目录 --> <workingDirectory>${project.basedir}</workingDirectory> </configuration> </plugin>
4. 排查路径问题的调试代码
在代码中添加以下输出,快速定位问题所在:
// 打印当前工作目录 System.out.println("当前工作目录:" + new File(".").getAbsolutePath()); // 检查文件状态 File excelFile = new File("test.xlsx"); System.out.println("文件是否存在:" + excelFile.exists()); System.out.println("文件绝对路径:" + excelFile.getAbsolutePath());
通过这些输出可以明确是文件位置不对,还是工作目录不符合预期。
内容的提问来源于stack exchange,提问作者Thaji
相关产品推荐
相关产品推荐

