【maven笔记】构建生命周期&插件:目标

1.概念关系

生命周期(LifeCircle)由阶段(phase)组成,阶段之间存在先序关系,阶段可以理解为构建过程中的一个步骤,如编译就是一个阶段

生命周期是maven根据项目构建中常用步骤抽象出了3个内置的生命周期clean、default、siteclean用于清理构建产生的数据,default用于项目部署,site用于生成项目文档。

maven设计为了更灵活,每个阶段可以有不同的实现,这个实现由插件实现,一个插件可以实现多个阶段,即目标。如下图,用Java的继承机制理解,可以把每个阶段Phase都当成一个接口,插件就是实现了多个接口(阶段)的实现类,目标就是Override接口方法的实现方法。

以packaging配置为jar为例  ,default默认的阶段 和绑定的目标如下

生命周期阶段Phase 插件:目标plugin:goal
process-resources maven-resources-plugin:resources
compile maven-compiler-plugin:compile
process-test-resources maven-resources-plugin:testResources
test-compile maven-compiler-plugin:testCompile
test maven-surefire-plugin:test
package maven-jar-plugin:jar
install maven-install-plugin:install
deploy maven-deploy-plugin:deploy

2.构建操作

2.1 常用操作

执行构建命令会按照生命周期中定义的阶段顺序逐一执行,mvn命令可接收多个目标或阶段

mvn [options] [<goal(s)>] [<phase(s)>]
mvn install
mvn clean deploy
mvn clean dependency:copy-dependencies package

如上的命令,当指定生命周期中的一个阶段,maven会执行该阶段所在生命周期的前序所有阶段。

mvn install执行时会执行install阶段执行之前会依次执行validatecompilepackage等等。

mvn clean deploy 涉及了两个生命周期,会执行clean周期中的pre-clean阶段和clean阶段;然后执行default周期中deploy之前的所有阶段。

mvn clean dependency:copy-dependencies package 这个命令逐一执行clean阶段(及其前驱阶段)、dependency:copy-dependencies目标、package阶段(及其前驱阶段)

2.2.maven默认生命周期&默认绑定

maven定义了3个生命周期,在配置文件<<<META-INF/plexus/components.xml>>>,如maven/maven-core/src/main/resources/META-INF/plexus/components.xml,如default生命周期定义如下:

    <component>
      <role>org.apache.maven.lifecycle.Lifecycle</role>
      <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
      <role-hint>default</role-hint>
      <configuration>
        <id>default</id>
        <!-- START SNIPPET: lifecycle -->
        <phases>
          <phase>validate</phase>
          <phase>initialize</phase>
          <phase>generate-sources</phase>
          <phase>process-sources</phase>
          <phase>generate-resources</phase>
          <phase>process-resources</phase>
          <phase>compile</phase>
          <phase>process-classes</phase>
          <phase>generate-test-sources</phase>
          <phase>process-test-sources</phase>
          <phase>generate-test-resources</phase>
          <phase>process-test-resources</phase>
          <phase>test-compile</phase>
          <phase>process-test-classes</phase>
          <phase>test</phase>
          <phase>prepare-package</phase>
          <phase>package</phase>
          <phase>pre-integration-test</phase>
          <phase>integration-test</phase>
          <phase>post-integration-test</phase>
          <phase>verify</phase>
          <phase>install</phase>
          <phase>deploy</phase>
        </phases>
        <!-- END SNIPPET: lifecycle -->
      </configuration>
    </component>

此处并没有定义阶段的具体实现,绑定目标在另一个配置文件中maven/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml中,其中为了每种打包方式都分别指定了各个所需阶段对应的绑定目标。如jar打包方式

<component>
  <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
  <role-hint>jar</role-hint>
  <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
  <configuration>
    <lifecycles>
      <lifecycle>
        <id>default</id>
        <!-- START SNIPPET: jar-lifecycle -->
        <phases>
          <process-resources>
            org.apache.maven.plugins:maven-resources-plugin:2.6:resources
          </process-resources>
          <compile>
            org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
          </compile>
          <process-test-resources>
            org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
          </process-test-resources>
          <test-compile>
            org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
          </test-compile>
          <test>
            org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
          </test>
          <package>
            org.apache.maven.plugins:maven-jar-plugin:2.4:jar
          </package>
          <install>
            org.apache.maven.plugins:maven-install-plugin:2.4:install
          </install>
          <deploy>
            org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
          </deploy>
        </phases>
        <!-- END SNIPPET: jar-lifecycle -->
      </lifecycle>
    </lifecycles>
  </configuration>
</component>

与上述表格的对应关系一致。

2.3 自定义目标并绑定

执行mvn命令时,执行了shell脚本,会使用launcher加载maven入口类org.apache.maven.cli.MavenCli

当需要自己定制化绑定时可以通过plugin元素配置,下面的样例中是自己实现类display-maven-plugin,然后绑定目标time到阶段process-test-resources

 <plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>display-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>time</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

2.4 从命令到目标构建

发布了92 篇原创文章 · 获赞 14 · 访问量 5848

猜你喜欢

转载自blog.csdn.net/sarafina527/article/details/103048791