google-java-format
统一代码格式化
项目代码通常是一个团队共同完成,要保障代码质量的首要前提就是统一代码的风格。统一代码风格的第一条就是统一代码格式化。
不同的人提交的代码格式化不一样将导致 merge 代码造成大概率冲突,而统一的代码风格无论对项目的可维护性,还是降低 merge 冲突都极为重要。
广泛使用的两种 Java 代码规范:
Alibaba Java Coding Guidelines
关于 Google Java Style,这里推荐使用两个代码格式化插件:
- IDE插件:google-java-format
- Maven插件:git-code-format-maven-plugin
google-java-format
google-java-format
插件可用于重新格式化 Java 源代码。启用后,它将替换通常的Reformat Code
操作。该操作可以通过Code->Reformat Code
触发,也可以使用Ctrl+Alt+L
触发。
整合导入优化
使用快捷键Shift+Ctrl+Alt+L
然后勾选Optimize imports
,Ctrl+Alt+L
还将会触发Optimize imports
。
设置 imports 不自动合并
IDEA 中使用 google-java-format 插件
在File->Settings->Plugins
中下载插件。
从1.16.0版本起,google-java-format
插件支持在优化导入时使用。
在File->Settings->google-java-format Settings
中勾选Enable google-java-format
为当前项目启用google-java-format
插件。
在File->New Peojects Setup->Seeting for New Projects->Other Settings->google-java-format Settings
中勾选Enable google-java-format
为新项目启用google-java-format
插件。
google-java-format 插件使用了一些内部类,需要一些额外的配置才可用。
在Help->Edit Custom VM Options...
中加入以下设置
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
完成后重启 IDE 即可。
git-code-format-maven-plugin
git-code-format-maven-plugin 源码
自动部署google-java-format
代码格式化程序作为预提交 git 钩子的插件。
在 Maven 中引入 git-code-format-maven-plugin 插件
将以下代码添加到pom.xml
文件中
pom.xml
<properties>
<git-code-format-maven-plugin.version>4.2</git-code-format-maven-plugin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>com.cosium.code</groupId>
<artifactId>git-code-format-maven-plugin</artifactId>
<version>${git-code-format-maven-plugin.version}</version>
<executions>
<!-- Format code during validate phase -->
<execution>
<id>formatter-hook</id>
<phase>validate</phase>
<goals>
<goal>format-code</goal>
</goals>
</execution>
<!-- On commit, format the modified files -->
<execution>
<id>install-formatter-hook</id>
<goals>
<goal>install-hooks</goal>
</goals>
</execution>
<!-- On Maven verify phase, fail if any file
(including unmodified) is badly formatted -->
<execution>
<id>validate-code-format</id>
<goals>
<goal>validate-code-format</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.cosium.code</groupId>
<artifactId>google-java-format</artifactId>
<version>${git-code-format-maven-plugin.version}</version>
</dependency>
</dependencies>
<configuration>
<formatterOptions>
<!-- Use AOSP style instead of Google Style (4-space indentation). -->
<googleJavaFormat.aosp>false</googleJavaFormat.aosp>
<!-- Format the javadoc -->
<googleJavaFormat.formatJavadoc>true</googleJavaFormat.formatJavadoc>
<!-- Fix import order and remove any unused imports, but do no other formatting. -->
<googleJavaFormat.fixImportsOnly>false</googleJavaFormat.fixImportsOnly>
<!-- Do not fix the import order. Unused imports will still be removed. -->
<googleJavaFormat.skipSortingImports>false</googleJavaFormat.skipSortingImports>
<!-- Do not remove unused imports. Imports will still be sorted. -->
<googleJavaFormat.skipRemovingUnusedImports>false</googleJavaFormat.skipRemovingUnusedImports>
</formatterOptions>
</configuration>
</plugin>
</plugins>
</build>
换行符设置
在不同系统中按下回车,保存进入文件的换行符是不一样的。
CR:表示回车\r
(Mac OS)
LF:表示换行\n
(Mac OS X、Linux/Unix)
CRLF:表示回车换行\r\n
(Windows)
IDEA 设置换行
Git 设置换行
Windows 默认在提交时把换行符CRLF转换为LF,拉取代码时将LF转换为CRLF;
Linux/Unix、Mac OS、Mac OS X 默认在提交时把换行符CRLF转换为LF,拉取时不进行转换;
当Git
设置CRLF
为false
,提交检出均不转换
当Git
设置CRLF
为true
,提交时将CRLF转换为LF,检出时将LF转换为CRLF
当Git
设置CRLF
为input
,提交时将CRLF转换为LF,检出不转换
使用 git-code-format-maven-plugin 插件
一起回顾一下 maven 构建生命周期
在validate
阶段,git-code-format:format-code
格式化代码(这个 goal 不是必须的)。
format-code
默认范围是所有文件。
在initialize
阶段,git-code-format:install-hooks
安装一个gitpre-commit
钩子
了解 Git Hooks
pre-commit.sh
脚本内容
在 git 的pre-commit
阶段,钩子触发git-code-format:on-pre-commit
,来格式化修改过的文件。
on-pre-commit
的扫描范围是 Git 暂存区的文件
在verify
阶段,git-code-format:validate-code-format
验证代码格式
使用命令格式化代码
mvn git-code-format:format-code -Dgcf.globPattern=**/*
使用命令验证代码格式
mvn git-code-format:validate-code-format -Dgcf.globPattern=**/*