在 Maven 中使用 Spotless

23-01-17 banq

使用 Maven 和 Spotless 为 Java 代码库强制执行代码样式和格式化规则。

Spotless 是一个通用格式插件 ,可用于在 Java 项目中强制执行代码样式和格式规则。它对于在整个团队中强制执行一致的风格以及确保您的代码满足某些质量标准特别有用。

Spotless是一个强大的工具,可以帮助确保你的代码具有一致性、可读性和高质量。通过将其集成到Maven构建过程中,您可以轻松检查代码中的任何样式和格式问题,并自动修复,从而节省时间和精力。

您可以使用Spotless的许多不同配置,包括执行谷歌Java风格指南的内置规则、执行特定风格和格式要求的自定义规则,以及与Checkstyle工具的集成。在Spring Boot项目中,你也可以使用Spotless提供的Spring格式化规则。


要将 Spotless 作为 Maven 构建的一部分运行,您需要将 Spotless Maven 插件添加到您的pom.xml文件中。
这是我们需要添加为 Maven 构建插件的配置:

<build>
  <plugins>
    <plugin>
      <groupId>com.diffplug.spotless</groupId>
      <artifactId>spotless-maven-plugin</artifactId>
      <executions>
        <execution>
          <id>format</id>
          <phase>process-sources</phase>
          <goals>
            <goal>check</goal>
            <goal>apply</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>


在这里,我们将 spotless 添加为一个构建插件,并介绍了这个插件应该何时运行的执行指令。

在Maven中,执行块用于指定某个插件的特定执行配置。它被定义在一个插件的执行元素中,可以包含一些控制插件行为的不同元素。

在你提供的例子中,执行块包含一个id元素,一个阶段元素,和一个目标元素。id元素用于指定执行的唯一标识符,可用于在Maven构建配置中的其他地方引用它。阶段元素指定了执行该插件的Maven构建过程的阶段。本例中,指定了process-sources阶段,这意味着该插件将作为编译项目源代码过程的一部分被执行。

目标元素用于指定应该作为插件执行的一部分而执行的目标。在这种情况下,检查和应用目标被指定,这将导致Spotless插件检查源代码的任何样式和格式问题,并在必要时进行修复。

总之,本例中的执行块用于配置Spotless插件的执行,作为Maven构建过程的一部分,指定它应在process-sources阶段运行并执行检查和应用目标。

运行安装:

mvn clean install


安装并配置 Spotless 后,您可以通过执行以下命令来运行它:

mvn spotless:check


此命令将检查代码库中的格式和样式问题并报告它们。

我们可以使用以下命令自动修复任何问题:

mvn spotless:apply


官方文档提供了一个有用的现成配置列表。你可以在这里为 Maven 找到它们。

完整配置:

<build>
    <plugins>
        <plugin>
            <groupId>com.diffplug.spotless</groupId>
            <artifactId>spotless-maven-plugin</artifactId>
            <configuration>
                <java>
                    <toggleOffOn/>
                    <importOrder/>
                    <removeUnusedImports/>
                    <palantirJavaFormat>
                        <version>2.27.0</version>
                    </palantirJavaFormat>
                    <indent>
                        <spaces>true</spaces>
                        <spacesPerTab>4</spacesPerTab>
                    </indent>

                    <formatAnnotations/>
                </java>
                <markdown>
                    <includes>
                        <include>**/*.md</include>
                    </includes>
                    <flexmark/>
                </markdown>
                <pom>
                    <includes>
                        <include>pom.xml</include>
                    </includes>
                    <sortPom>
                        <encoding>UTF-8</encoding>
                        <keepBlankLines>true</keepBlankLines>
                        <nrOfIndentSpace>4</nrOfIndentSpace>
                        <indentBlankLines>false</indentBlankLines>
                        <indentSchemaLocation>true</indentSchemaLocation>
                        <expandEmptyElements>false</expandEmptyElements>
                        <sortProperties>true</sortProperties>
                    </sortPom>
                </pom>
            </configuration>
            <executions>
                <execution>
                    <id>format</id>
                    <goals>
                        <goal>check</goal>
                        <goal>apply</goal>
                    </goals>
                    <phase>process-sources</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>