Maven的生命周期以及插件配置

1,956 阅读3分钟

Maven的生命周期以及spotbugs插件配置

摘要

\quad\quad 本文旨在介绍何谓Maven的生命周期,以及spotbugs代码检查工具的使用。

目录

(点击可直接跳转)
*1.前言
*2.配置spotbugs代码检查插件
*3.Maven的生命周期

1.前言

\quad\quad 用了这么久的mvn test命令来测试自己的代码有没有bug,我居然一直不知道这个命令的内涵是啥,有时候用mvn test也可以,用mvn verify也可以。学习过后才知道,这里面涉及了Maven的生命周期问题。下面就稍微记录一下自己学习的这个过程,有不对的地方非常欢迎指出,会及时修改。

2.配置spotbugs代码检查插件

\quad\quad spotbugs的前身叫findbugs,但是findbugs在Java 9以后就不维护了,继而衍生了spotbugs,也是非常强大的代码检查工具。
\quad\quad 首先进入spotbugs官网,根据自己的需求找到对应的帮助文档。这里,我使用的是Maven,所以我需要将如下代码加入pom.xml文件中,代码源自官方文档

<plugin>
  <groupId>com.github.spotbugs</groupId>
  <artifactId>spotbugs-maven-plugin</artifactId>
  <version>3.1.12</version>
  <dependencies>
    <!-- overwrite dependency on spotbugs if you want to specify the version of spotbugs -->
    <dependency>
      <groupId>com.github.spotbugs</groupId>
      <artifactId>spotbugs</artifactId>
      <version>4.0.0-beta3</version>
    </dependency>
  </dependencies>
</plugin>

如图所示:

刷新Maven后,接下来在代码中写一个bug来测试一下:

 public static void main(String[] args){
        Integer i = null;
        if (i == 1) {
        }
    }

很明显,Integer在拆箱时会产生一个空指针异常。这时候我们运行mvn test

发现特喵的居然通过了,垃圾插件。别着急,相信科学,插件没正常运行基本上是自己的问题。我们需要知道spotbugs检查的是编译后的字节码,但是
从log中我们看到,代码没有被编译就运行了检查,所以发现不了代码中的bug。这时候,先给出解决方法: 在"< dependencies >"标签下加入如下代码:

                <executions>
                    <execution>
                        <id>spotbugs</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>

如图所示:

刷新Maven后运行mvn verify命令:

可以看到,代码被执行了编译并且发现了前面的空指针异常。使用
mvn spotbugs:gui命令可以看到图形化的界面。

3.Maven的生命周期

\quad\quad 通过Maven官方文档我们可以看到Maven定义了三套生命周期,包括Clean Lifecycle/Default Lifecycle/Site Lifecycle,最常用的就是默认的了。
可以看到默认的声明周期包括如下阶段:

\quad\quad当我们在命令行中输入:mvn test时,Maven就会从最开始的validate一直执行到test,verify同理。但是,如果我们没有告诉test/verify需要做什么,mvn是什么都不会去做的。所以,就需要在plugin中与mvn的阶段相绑定。这样就能解释为什么有时候我们使用mvn test与mvn verify都可以执行一些插件,就是因为我们把插件绑定在了mvn的test阶段,这样运行verify的时候,同样会运行test。同样可以解释为什么不加< execution >标签中的内容,就不会执行spotbugs插件。
\quad\quad 一个mvn阶段当然也可以绑定多个插件,执行的顺序按照声明的顺序来,这些都可以在log中看出来。