Maven 生命周期

生命周期(Lifecycle)

    maven将整个项目构建过程分为三个过程,每个过程都已经被定义成抽象模板,并通过插件的方式来确认具体的使用。

clean(清理阶段)

* pre-clean: 清理之前do something
* clean:执行清理过程
* post-clean:清理之后do something
我们通过maven-clean-plugins插件绑定clean阶段;

mvn clean

[INFO] ------------------------------------------------------------------------
[INFO] Building maven-hello 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-hello ---
[INFO] Deleting /Users/wangzhiping/idea-workspace/maven-study/target
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.346s
[INFO] Finished at: Mon Aug 21 14:55:40 CST 2017
[INFO] Final Memory: 6M/155M
[INFO] ------------------------------------------------------------------------
# 删除target文件夹
  • 自定义maven-clean-plugin插件

继承AbstractMojo自定义

package main.java.study.wzp.maven.plugin.clean;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;

import java.io.File;

/**
 * Created by wangzhiping on 17/8/21.
 * @goal myclean
 */
public class CleanMojo extends AbstractMojo {

    /**
     * @parameter expression = "${project.build.directory}"
     * @readOnly
     * @required
     *
     * @throws MojoExecutionException
     * @throws MojoFailureException
     *
     */
    private File targetDirectory;

    /**
     * 删除非空文件夹
     */
    private void deleteDir(File file) {

        if (file.isFile()){
            file.delete();
        } else if (file.isDirectory()){
            File[] files = file.listFiles();
            if (files.length == 0){
                file.delete();
            }else {
                for (File f : files) {
                    deleteDir(f);
                }
            }
        }

        file.delete();
    }

    /**
     * 核心执行逻辑
     * @throws MojoExecutionException
     * @throws MojoFailureException
     */
    public void execute() throws MojoExecutionException, MojoFailureException {

        if (null != targetDirectory && targetDirectory.exists() && targetDirectory.isDirectory()) {
            deleteDir(targetDirectory);
            getLog().info("Delete: " + targetDirectory.getAbsolutePath());
            return;
        }

        getLog().warn("Delete failure: " + targetDirectory.getAbsolutePath() + " is't exist!");

    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>study.wzp.maven</groupId>
    <artifactId>my-clean-plugin</artifactId>
    <version>1.0</version>


    <!-- maven插件打包模式 -->
    <packaging>maven-plugin</packaging>

    <dependencies>
        <!-- 插件开发的API -->
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
</project>

可以通过mvn install安装到本地。

其他项目引用

<build>
        <plugins>
            <plugin>
                <groupId>study.wzp.maven</groupId>
                <artifactId>my-clean-plugin</artifactId>
                <version>1.0</version>
            </plugin>
        </plugins>
</build>

执行

mvn study.wzp.maven:my-clean-plugin:1.0:myclean
 详情可以参考:maven-clean-plugin 插件源码;

default(项目构建阶段)

详细的阶段:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
不过可以大致分为:
1、主项目资源处理;
2、主项目代码编译;
3、测试资源处理;
4、测试代码编译;
5、执行单元测试;
6、打包;
7、安装;
8、发布;
其实就是:
编译(maven-compiler-plugin) --> 测试(maven-surefire-plugin) --> 
打包(maven-jar-plugin)      --> 安装(maven-install-plugin)  --> 
发布(maven-deploy-plugin) 

site(项目站点阶段)

这个阶段的目的是为了建立和发布项目站点,主要包括:各种文档(例如:javadoc);
主要包含:
1、pre-site
2、site 生成项目站点文档
3、post-site
4、site-deploy 将生成的项目站点发布到服务器上

plugin goal(插件目标)

简单理解就是插件的功能点,一个插件通常可以理解为一个功能的聚合。每一个功能就是一个goal,这样我们可以单独的出执行goal,从而提高功能的可复用性。
例如:mvn dependency:tree; mvn dependency:list; mvn dependency:analyze ,其中tree,list,analyze 都是goal,描述和承载的功能是独立的。

插件绑定

maven定义了所有的生命周期,就像定义了模板一样,具体的实现都是交给插件来完成的.
  • 内置绑定(默认绑定)
在使用maven时,我们并没有去显示的操作生命周期阶段步骤与插件进行绑定的动作,原因是maven已默认做了一些基本使用的插件绑定。其配置在:maven-core/src/main/resources/META-INF/plexus/default-binding.xml / components.xml 

default-binding.xml(定义了各种packaging对应的插件信息)

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!--

Mappings to default lifecycle, specific for each packaging.

-->

<component-set>
  <components>
    <!--
     | POM
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>pom</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: pom-lifecycle -->
            <phases>
              <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: pom-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <!--
     | 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>

    <!--
     | EJB
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>ejb</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: ejb-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-ejb-plugin:2.3:ejb
              </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: ejb-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <!--
     | MAVEN PLUGIN
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>maven-plugin</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: maven-plugin-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-classes>
                org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor
              </process-classes>
              <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,
                org.apache.maven.plugins:maven-plugin-plugin:3.2:addPluginArtifactMetadata
              </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: maven-plugin-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <!--
     | WAR
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>war</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: war-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-war-plugin:2.2:war
              </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: war-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <!--
     | EAR
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>ear</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: ear-lifecycle -->
            <phases>
              <generate-resources>
                org.apache.maven.plugins:maven-ear-plugin:2.8:generate-application-xml
              </generate-resources>
              <process-resources>
                org.apache.maven.plugins:maven-resources-plugin:2.6:resources
              </process-resources>
              <package>
                org.apache.maven.plugins:maven-ear-plugin:2.8:ear
              </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: ear-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

    <!--
     | RAR
     |-->
    <component>
      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
      <role-hint>rar</role-hint>
      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
      <configuration>
        <lifecycles>
          <lifecycle>
            <id>default</id>
            <!-- START SNIPPET: rar-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-rar-plugin:2.2:rar
              </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: rar-lifecycle -->
          </lifecycle>
        </lifecycles>
      </configuration>
    </component>

  </components>
</component-set>

components.xml(clean,default,site生命周期插件绑定和步骤定义)

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!--
  There is currently only one component descriptor that cannot be generated from annotations because of the
  accompanying configuration. Our options are to embed this information programatically or use a configuration source
  to pull in the lifecycle information.
-->
<component-set>
  <components>
    <!-- 'default' lifecycle, without any binding since it is dependent on packaging -->
    <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>

    <!-- 'clean' lifecycle, with default binding -->
    <component>
      <role>org.apache.maven.lifecycle.Lifecycle</role>
      <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
      <role-hint>clean</role-hint>
      <configuration>
        <id>clean</id>
        <!-- START SNIPPET: clean -->
        <phases>
          <phase>pre-clean</phase>
          <phase>clean</phase>
          <phase>post-clean</phase>
        </phases>
        <default-phases>
          <clean>
            org.apache.maven.plugins:maven-clean-plugin:2.5:clean
          </clean>
        </default-phases>
        <!-- END SNIPPET: clean -->
      </configuration>
    </component>

    <!-- 'site' lifecycle, with default bindings -->
    <component>
      <role>org.apache.maven.lifecycle.Lifecycle</role>
      <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
      <role-hint>site</role-hint>
      <configuration>
        <id>site</id>
        <!-- START SNIPPET: site -->
        <phases>
          <phase>pre-site</phase>
          <phase>site</phase>
          <phase>post-site</phase>
          <phase>site-deploy</phase>
        </phases>
        <default-phases>
          <site>
            org.apache.maven.plugins:maven-site-plugin:3.3:site
          </site>
          <site-deploy>
            org.apache.maven.plugins:maven-site-plugin:3.3:deploy
          </site-deploy>
        </default-phases>
        <!-- END SNIPPET: site -->
      </configuration>
    </component>

    <component>
      <role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role>
      <role-hint>maven</role-hint>
      <implementation>org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher</implementation>
      <description>Maven Security dispatcher</description>
      <requirements>
        <requirement>
          <role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
          <field-name>_cipher</field-name>
        </requirement>
        <requirement>
          <role>org.sonatype.plexus.components.sec.dispatcher.PasswordDecryptor</role>
          <field-name>_decryptors</field-name>
        </requirement>
      </requirements>
      <configuration>
        <_configuration-file>~/.m2/settings-security.xml</_configuration-file>
      </configuration>
    </component>
  </components>
</component-set>

这里写图片描述

maven源码

https://github.com/apache/maven.git 有兴趣可以看看源码就对了解maven还是比较好的方式
  • 自定义绑定
这个比较简单,就是配置build->plugins->plugin即可。
<build>
    <plugins>
        <plugin>
            <groupId>####</groupId>
            <artifactId>####</artifactId>
            <version>####</version>
        </plugin>
    </plugins>
</build>
详细插件配置可参考:https://maven.apache.org/guides/mini/guide-configuring-plugins.html 这里不作概述

参考

[1] https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
[2] http://www.codetab.org/apache-maven-tutorial/maven-lifecycle-and-goals/
[3] https://maven.apache.org/guides/mini/guide-configuring-plugins.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值