IntelliJ构建多模块项目时Java访问target目录文件被拒绝问题求助
我使用的IntelliJ IDEA版本为2021.1.3,当前运行多模块项目时遇到如下异常:
- 执行命令行编译(例如
mvn clean install)可以正常完成 - 使用IntelliJ内置构建功能(调试单元测试的前置操作)时触发系统报错,IDE的JDK、Maven主目录、Maven配置、本地仓库均和命令行配置完全一致。报错信息为法语,和操作系统语言一致,控制台具体报错如下:
java: D:\<path>\target\classes\<path>\rest-services.json (Accès refusé)
其中Accès refusé对应英文Access denied,即访问被拒绝。
说明:我无法提供更多调试信息和可复现方案,提交该问题的目的是收集有同款问题解决经验的用户给出的可行方案,方便后续其他遇到相同问题的用户搜索时可以直接定位到解决方案,减少不必要的排查时间。
问题文件是构建过程中从src/main/resources目录复制到target目录的,后续构建流程尝试访问该文件时,IntelliJ的访问请求被系统拒绝。
我已经尝试过如下方案,均未生效:
- 将IntelliJ IDEA升级到最新版本
- 手动删除对应目录下的问题文件后重新构建(文件会被重新复制,但仍提示访问被拒绝)
- 先用Maven全量清理并重新构建项目后再尝试IntelliJ构建
- 以管理员权限运行IntelliJ IDEA
- 多次执行IntelliJ的
File / Invalidate Caches / Invalidate Caches and Restart操作 - 重启电脑
- 使用Windows Process Explorer检查,确认该文件没有被其他进程锁定
- 删除并重新创建IntelliJ的测试运行配置
目前我找到的临时解决方法是:从VCS中检出源码目录下的问题文件,清除文件的只读属性,即可让系统授予IntelliJ读取该文件的权限。但该方案仅为临时 workaround,并非根本解决方案:如果遇到无法修改只读属性的文件(比如自动生成的文件)问题会复现。同时该现象非常特殊:大量带只读属性的文件从源码目录复制到target目录(包括问题文件所在的同一个目录),但仅该文件触发报错。
该问题是Windows系统下Git权限标记逻辑与IntelliJ原生构建逻辑冲突导致的:Git默认会将远端拉取的文件标记为只读,IntelliJ原生构建在复制资源文件时,不会主动处理文件权限,也不会及时释放文件句柄,导致复制后的文件被系统判定为独占占用,后续流程访问时触发权限拒绝。
你可以通过以下任意一种方案彻底解决问题:
方案1:委托Maven执行IDE构建操作
打开File > Settings > Build, Execution, Deployment > Build Tools > Maven > Runner,勾选Delegate IDE build/run actions to Maven,之后IntelliJ的构建、运行、调试操作都会直接调用Maven执行,和命令行逻辑完全一致,不会再出现原生构建的权限问题。
方案2:关闭Git的文件权限追踪
执行命令git config --global core.fileMode false,关闭Git对文件权限的追踪,后续从VCS拉取的文件不会再被自动标记为只读,从根源避免只读文件复制后的权限冲突。
如果你的项目中存在必须保留只读属性的文件,还可以在对应模块的pom.xml中添加资源复制的权限配置,确保复制后的文件自动授予读权限:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <attributes> <attribute name="readOnly" value="false"/> </attributes> </resource> </resources> </build>
内容的提问来源于stack exchange,提问作者Matteo NNZ

