Maven的生命周期及插件

204 阅读3分钟

这是我参与 8 月更文挑战的第5天,活动详情查看: 8月更文挑战

Maven的生命周期是为了对所有的构建过程进行抽象和统一。生命周期是抽象的,并没有实际的工作内容,其实现任务都交由插件来完成。类似于设计模式中的模板方法,父类中定义好了通用逻辑,由子类实现具体的执行过程。在Maven中生命周期类比父类,而插件实现具体的逻辑。

生命周期

Maven共有三套相互独立的生命周期,分别为:

  • clean:清理项目
  • default (build):构建项目
  • site:建立项目的站点

每一个生命周期包含多个阶段,各个阶段是顺序执行的。例如执行 mvn clean 命令,表示会执行pre-clean和clean的阶段工作;又比如执行mvn install,表示执行validate到install阶段之间的所有过程。

Clean的生命周期

目的是清理项目,共有三个阶段:

  • pre-clean:执行一些清理前需要完成的工作
  • clean:清理上一次构建生成的文件
  • post-clean:执行一些清理后需要完成的工作

default的生命周期

目的是构建项目,也是构建时真正执行的步骤,最核心的部分。这里列下比较重要的阶段:

  • validate
  • initialize
  • generate-sources
  • process-sources 处理项目主资源文件。一般来说是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
  • process-resources
  • compile 编译项目的主源码。一般来说是编译src/main/java 目录下的Java文件至项目输出的主classpath目录中。
  • process-test-sources 处理项目测试资源文件。针对src/test/resources目录下的测试资源
  • test-compile 编译项目的测试代码。针对src/test/java目录下Java文件进行编译并输出到测试classpath目录中。
  • test 使用单元测试框架进行测试,测试代码不会被打包或部署。
  • package 接受编译好的代码,打包成可发布的格式,如Jar,War。
  • verify
  • install 将打包好的包安装到Maven本地仓库,供本地其他Maven项目使用。
  • deploy 将最终的包复制到远程仓库,共其他开发人员和Maven项目使用。

Site的生命周期

Site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的扎尼丹,方便团队交流和发布项目信息。该生命周期包含如下阶段:

  • pre-site 执行一些在生成项目站点之前需要完成的工作。
  • site 生成项目站点文档。
  • post-site 执行一些在生成项目站点之后需要完成的工作。
  • site-deploy 将生成的项目站点发布到服务器上。

插件

Maven 生命周期交由插件来实现,一个插件有着多个目标,一个目标对应一个功能。例如maven-dependency-plugin 插件有这样的目标,dependency:list、dependency:tree、dependency:analyze,分别表示查看项目依赖、查看项目依赖树、依赖分析不同的功能。

常用的插件配置

  • 源码编译插件
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <compilerVersion>${java.version}</compilerVersion>
        </configuration>
    </plugin>
  • 资源编译插件
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <resources>/src/main/resources</resources>  <!--默认的资源路径 -->
        </configuration>
    </plugin>
  • 测试插件
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
    </plugin>