Maven使用教程三:maven的生命週期及插件機制詳解

前言

今天這個算是學習Maven的一個收尾文章,裏面內容不侷限於標題中提到的,後面還加上了公司實際使用的根據profile配置項目環境以及公司如今用的archetype 模板等例子。java

後面還會總結一個大的思惟導圖記錄下本身學習的歸納。mysql

Maven的生命週期介紹

先來複習幾個命令:git

  • mvn clean package:打包
  • mvn clean install:安裝到本地
  • mven clean deploy:部署到遠程倉庫

mvn有三套徹底獨立的生命週期,clean、default和site
每套生命週期都會包含多個phase,每一個phase又是由各類插件的goal來完成的。web

phase能夠理解爲任務單元,生命週期是總任務,phase就是總任務分出來的一個個子任務,可是這些子任務是被規格化的,它能夠同時被多個生命週期所包含,一個生命週期包含多個phase,phsse的執行時順序的,一個phase能夠綁定多個goal,至少一個。spring

goal是執行任務最小的單元,它能夠綁定到任意的phase中,一個phase有一個或多個goal,goal也是按順序執行的,一個phase被執行時,綁定到phase裏的goal會按綁定的時間被順序執行。sql

Maven的生命週期以及phase

clean的生命週期包含的phase以下:shell

  • pre-clean
  • clean
  • post-clean

default的生命週期包含的phase以下:數據庫

  • validate:校驗這個項目的一些配置信息是否正確
  • initialize:初始化構建狀態,好比設置一些屬性,或者建立一些目錄
  • generate-sources:自動生成一些源代碼,而後包含在項目代碼中一塊兒編譯
  • process-sources:處理源代碼,好比作一些佔位符的替換
  • generate-resources:生成資源文件,纔是乾的時我說的那些事情,主要是去處理各類xml、properties那種配置文件,去作一些配置文件裏面佔位符的替換
  • process-resources:將資源文件拷貝到目標目錄中,方便後面打包
  • compile:編譯項目的源代碼
  • process-classes:處理編譯後的代碼文件,好比對java class進行字節碼加強
  • generate-test-sources:自動化生成測試代碼
  • process-test-sources:處理測試代碼,好比過濾一些佔位符
  • generate-test-resources:生成測試用的資源文件
  • process-test-resources:拷貝測試用的資源文件到目標目錄中
  • test-compile:編譯測試代碼
  • process-test-classes:對編譯後的測試代碼進行處理,好比進行字節碼加強
  • test:使用單元測試框架運行測試
  • prepare-package:在打包以前進行準備工做,好比處理package的版本號
  • package:將代碼進行打包,好比jar包
  • pre-integration-test:在集成測試以前進行準備工做,好比創建好須要的環境
  • integration-test:將package部署到一個環境中以運行集成測試
  • post-integration-test:在集成測試以後執行一些操做,好比清理測試環境
  • verify:對package進行一些檢查來確保質量過關
  • install:將package安裝到本地倉庫中,這樣開發人員本身在本地就可使用了
  • deploy:將package上傳到遠程倉庫中,這樣公司內其餘開發人員也可使用了

site生命週期的phaseapi

  • pre-site
  • site
  • post-site
  • site-deploy

### 默認的phase和pluginmybatis

咱們直接運行mvn clean package的時候,每一個phase都是由插件goal來完成的,phase和plugin綁定的關係是什麼了?

實際上,默認maven就綁定了一些plugin goal到phase上,好比:

相似於resources:resources這種格式,說的就是resources這個plugin的resources goal(resources功能,負責處理資源文件)

maven的命令行與生命週期

好比咱們執行mvn clean package生命週期是什麼樣的?

clean是指的clean生命週期中的clean phase
package是指default生命週期中的package phase

此時就會執行clean生命週期中在clean phase以前的全部phase和clean phase(pre-clean、clean)
同事執行default生命週期中在package phase以前的全部phase和package phase

clean默認綁定的是clean:clean, clean plugin的clean goal,因此就會去執行clean插件的clean goal。

具體執行流程以下圖:

04_maven生命週期原理.png

maven中使用plugin實戰

需求:項目中有mybatis 自動生成代碼,但願執行某些maven命令能夠自動根據指定的表設置 生成對應代碼。

添加mybatis.generator的plugin,而後配置generate goal

<build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>mybatis-generator-config.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.mybatis.generator</groupId>
                        <artifactId>mybatis-generator-core</artifactId>
                        <version>1.3.2</version>
                    </dependency>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql-connector.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>com.wangmeng.game</groupId>
                        <artifactId>game-wangmeng-common</artifactId>
                        <version>1.0-SNAPSHOT</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

再看看mybatis-generator-config.xml配置的sql信息:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
    <context id="context" targetRuntime="MyBatis3">
        <plugin type="org.mybatis.plugin.PaginationPlugin">
        </plugin>

        <commentGenerator>
            <property name="suppressAllComments" value="false"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 數據庫的相關配置 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://ip:3306/db?useUnicode=true" userId="root"
                        password=""/>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 實體類生成的位置 -->
        <javaModelGenerator targetPackage="com.wangmeng.game.league.entity"
                            targetProject="game-wangmeng-entity/src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- *Mapper.xml 文件的位置 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="game-wangmeng-dao/src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- Mapper 接口文件的位置 -->
        <javaClientGenerator targetPackage="com.wangmeng.game.league.dao" 
                             targetProject="game-wangmeng-dao/src/main/java"
                             type="XMLMAPPER">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 相關表的配置 -->
        <table tableName="t_table" domainObjectName="TableEntity" enableCountByExample="true"
               enableDeleteByExample="true"
               enableSelectByExample="true"
               enableUpdateByExample="true">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>

    </context>
</generatorConfiguration>

咱們能夠在idea maven中看到咱們配置好的plugin了,而後點擊執行便可:

2E54BFFE-005B-4464-9A38-2CFD74176C8D.png

plugin:mybatis-generator
goal:generate

利用profile區分不一樣環境

    <profiles>
    <profile>
        <!--local env-->
        <id>dev</id>
        <properties>
            <profiles.active>dev</profiles.active>
        </properties>
        <activation>                  
           <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <!--test env-->
        <id>test</id>
        <properties>
            <profiles.active>test</profiles.active>
        </properties>
    </profile>
    <profile>
        <!--UT env-->
        <id>ut</id>
        <properties>
            <profiles.active>ut</profiles.active>
        </properties>
    </profile>
</profiles>

這裏默認使用的是dev環境,經過<activation>配置的。

maven版本管理和git之間的關係

一圖流:

05_maven和git之間的關係.png

maven高階:archetype模板

artchetype其實就是個maven項目模板

拿一個咱們公司如今用的東西舉例,當咱們建立一個全新的項目時,不可能再從新new一個全新的maven項目了,公司其實早就爲咱們提供了項目生成的腳手架,只須要執行一段maven命令便可生成好一個全新的項目,項目結構在這裏都是給定義好了的。

這樣的好處一是方便咱們建立項目,二是方便公司規範的執行和管理。

這裏直接拿公司的一個artchetype的一個模板來演示(關鍵信息已經馬賽克)

1,本身能夠選擇生成一個maven archetype quickstart或者maven archetype webapp項目

211.png

而後用mvn deploy 便可把archetype jar包上傳到maven私服

2,使用自定義的maven archetype

公司裏面是直接封裝了一個bat可執行文件,執行方式爲

cmd到CreateProject-latest.bat目錄,執行命令CreateProject-latest.bat 項目名 包名,如CreateProject-latest.bat shop-report report 便可使用最新版本的腳手架生成工程 xx-spring-cloud-api-shop-report,包名爲com.xx.report。把項目copy到你的喜歡的地址,再導入到eclipse或idea中便可。請手動添加gitignore。請修改父項目版本爲最新的release版本。

CreateProject-latest.bat

echo on & color 0A
setlocal enabledelayedexpansion

if "%1"=="" goto BLANK
if "%2"=="" goto BLANK

set ProjectName=%1
set packageName=%2
set archetypeVersion=LATEST

mvn dependency:copy -Dartifact=com.xx:xx-archetype-springcloud-archetype:%archetypeVersion% -Dmdep.stripVerison=true & echo Y | mvn archetype:generate -DarchetypeCatalog=local -DarchetypeGroupId=com.tuhu -DarchetypeArtifactId=xx-archetype-springcloud-archetype -DarchetypeVersion=%archetypeVersion% -DgroupId=com.tuhu -DartifactId=%ProjectName% -Dversion=0.0.1-SNAPSHOT -Dpackage=com.xx.%packageName% & rd/s/q ${project.basedir} & rd/s/q %ProjectName%\.idea & ren %ProjectName% xx-spring-cloud-api-%ProjectName%

感興趣的小夥伴可關注我的公衆號:壹枝花算不算浪漫

22.jpg

相關文章
相關標籤/搜索