Windows下formatter-maven-plugin校验失败问题求助
这问题我之前帮团队排查过好几次,核心就是Windows和Linux的换行符差异在搞事情,具体拆解下:
为什么会出现跨系统差异?
1. 换行符编码的系统默认差异
Windows系统默认用CRLF(也就是\r\n)作为换行符,而Linux/macOS用的是LF(\n)。你在Linux环境格式化并提交代码后,文件的换行符是LF;但Windows克隆项目时,Git默认会自动把仓库里的LF转换成CRLF(这是Git的autocrlf默认配置导致的)。这时候文件的字节内容已经变了,formatter插件的validate目标是做字节级的校验,自然会认为文件没被正确格式化。
2. formatter插件的校验逻辑依赖系统默认
你的formatter-maven-plugin配置里没有明确指定换行符风格,插件会自动使用当前系统的默认换行符。也就是说:
- Linux上格式化时用
LF,提交的文件也是LF - Windows上插件校验时,会拿当前
CRLF的文件和“预期LF格式的文件”对比,直接判定不匹配,抛出报错
解决办法(三步统一跨系统行为)
1. 用.gitattributes强制Git统一换行符
在项目根目录创建.gitattributes文件,写入以下内容:
* text=auto eol=lf
这个配置会告诉Git:所有文本文件统一以LF格式存储到仓库,拉取到本地时也保持LF(不管是Windows还是Linux)。现在主流IDE(IDEA、Eclipse、VS Code)都支持编辑LF换行符的文件,不用担心编辑问题。
2. 给formatter插件明确指定换行符
修改你的插件配置,添加<lineEnding>LF</lineEnding>,强制插件用LF格式化和校验,不再依赖系统默认:
<plugin> <groupId>net.revelc.code.formatter</groupId> <artifactId>formatter-maven-plugin</artifactId> <version>2.9.0</version> <executions> <execution> <goals> <goal>validate</goal> </goals> <configuration> <configFile>${project.basedir}/../eclipse/eclipse-formatter.xml</configFile> <encoding>UTF-8</encoding> <!-- 强制使用LF换行符,消除系统差异 --> <lineEnding>LF</lineEnding> </configuration> </execution> </executions> </plugin>
同时建议检查你的eclipse-formatter.xml,找到lineDelimiter相关配置,确保设置为LF(如果没有的话可以手动添加,避免IDE格式化时用系统默认)。
3. 修复Windows本地仓库的现有文件
在Windows的项目目录下打开Git Bash,执行以下命令,让Git重新拉取并应用.gitattributes的配置,把本地文件的换行符统一为LF:
git rm --cached -r . git reset --hard
执行完后再运行mvn clean install,应该就不会再出现校验失败的报错了。
内容的提问来源于stack exchange,提问作者Sam Samovich




