使用Apache FileUtils复制文件时无法识别.gitignore该如何解决?
问题根因
- 主流Java构建工具(Maven、Gradle等)默认会过滤类路径下以
.开头的隐藏文件,不会将其打包到最终的class输出目录,因此ClassPathResource无法读取到.gitignore资源,这是该代码对其他文件生效、唯独.gitignore失效的核心原因。 - 现有代码存在逻辑漏洞:如果传入的
file参数不带路径分隔符/,lastIndexOf("/")会返回-1,此时substring(-1)会直接抛出索引越界异常。
解决方案
方案1:调整构建配置+优化代码(适用于.gitignore存放在资源目录的场景)
步骤1:修改构建配置,强制包含.gitignore文件
如果使用Maven,修改pom.xml的build节点:
<build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> <include>**/.gitignore</include> </includes> </resource> </resources> </build>
如果使用Gradle,修改build.gradle配置:
processResources { include '**/.gitignore' }
配置修改完成后请执行构建清理操作(Maven执行
mvn clean install,Gradle执行gradle clean build,IDEA用户可以点击Build - Rebuild Project),确保资源文件正确同步。
步骤2:优化代码逻辑,规避异常同时简化文件复制操作
public void copyFile(String destinationPath, String file) throws IOException { ClassPathResource classPathResourceAPIUtils = new ClassPathResource(file); // 优化文件名截取逻辑,兼容不带/的路径 String fileName = file.contains("/") ? file.substring(file.lastIndexOf("/") + 1) : file; File destFile = new File(destinationPath, fileName); // 直接使用FileUtils原生流复制方法,避免自行处理读写的编码、流关闭等问题 try (InputStream inputStream = classPathResourceAPIUtils.getInputStream()) { FileUtils.copyInputStreamToFile(inputStream, destFile); } }
方案2:直接读取文件系统路径(适用于.gitignore存放在项目根目录的场景)
如果.gitignore不需要打包到类路径,可以直接绕过ClassPathResource,从文件系统直接读取复制:
public void copyGitignore(String projectRootPath, String destinationPath) throws IOException { File sourceGitignore = new File(projectRootPath, ".gitignore"); File destGitignore = new File(destinationPath, ".gitignore"); FileUtils.copyFile(sourceGitignore, destGitignore); }
内容的提问来源于stack exchange,提问作者Soumav
相关产品推荐
相关产品推荐

