maven生命周期lifecycle和plugins介绍
一、Maven的生命周期
生命周期的定義:Maven的生命周期就是為了對(duì)所有的構(gòu)建過(guò)程進(jìn)行抽象和統(tǒng)一。在大量項(xiàng)目的構(gòu)建過(guò)程中,Maven總結(jié)出了一套高度完善的,易于擴(kuò)展的生命周期,包括項(xiàng)目的清理,初始化,編譯,測(cè)試,打包,集成測(cè)試,驗(yàn)證,部署和生成站點(diǎn)等構(gòu)建步驟。在我們?nèi)粘5膍aven使用中,一條條簡(jiǎn)單的命令,mvn clean, mvn package等都是在執(zhí)行Maven的某個(gè)生命周期階段。Maven提供了三套獨(dú)立的生命周期:clean, default 和 site ,接下來(lái)我們分別介紹三套生命周期:
clean生命周期的目的是清理項(xiàng)目,刪除前一次構(gòu)建在target文件夾下生成的各個(gè)Jar包等,它包含以下三個(gè)階段:
- pre-clean:執(zhí)行一些清理前需要完成的工作
- clean:清理上一次構(gòu)建生成的文件
- post-clean:執(zhí)行一些清理后需要完成的工作
舉例:
我們?cè)诿钚兄休斎?#xff1a; mvn clean 就是在調(diào)用clean生命周期的clean階段,實(shí)際執(zhí)行了pre-clean和clean階段
default生命周期定義了真正構(gòu)建項(xiàng)目中需要執(zhí)行的所有步驟,它包含的階段如下:
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile:編譯項(xiàng)目的主源碼
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources
test-compile
process-test-classed
test:使用單元測(cè)試框架運(yùn)行測(cè)試,測(cè)試代碼不會(huì)被打包或部署
prepare-package
package:接受編譯好的代碼,打包成可發(fā)布的格式,jar/war等
pre-integration-test
integration-test
post-integration-test
verify
install
deploy
- 此處我們注意下 install 生命周期階段,若我們?cè)诋?dāng)前的maven項(xiàng)目中執(zhí)行 mvn install ,那么將執(zhí)行validate到 install 的所有生命周期階段,結(jié)果就是將我們當(dāng)前的項(xiàng)目打包并且安裝在了本地倉(cāng)庫(kù)。但是install插件還有一個(gè)目標(biāo) install-file 該插件目標(biāo)可以將我們普通Java項(xiàng)目到處的jar包安裝到本地倉(cāng)庫(kù)。舉例如下:
-
mvn test 就是在調(diào)用default生命周期的test階段,實(shí)際執(zhí)行了validate到test階段之間的所有階段
-
mvn clean package 就是在調(diào)用clean生命周期的clean階段和default生命周期的package階段,實(shí)際執(zhí)行了pre-clean和clean階段和default生命周期validate到package階段之間的所有階段
-
mvn clean install 和 mvn clean deploy 所調(diào)用的生命周期階段請(qǐng)各位自行分析(對(duì)于聰明的你來(lái)說(shuō)一定沒(méi)什么難度)
site生命周期的目的是建立和發(fā)布項(xiàng)目站點(diǎn),Maven可以給予pom所包含的信息,生成一個(gè)站點(diǎn),方便團(tuán)隊(duì)交流和發(fā)布項(xiàng)目信息,其生命周期階段包含:
- pre- site
- site:生成項(xiàng)目站點(diǎn)文檔
- post-site
- site-deploy:將生成的項(xiàng)目站點(diǎn)發(fā)布到服務(wù)器上
二、plugins
好的,介紹了三套Maven生命周期之后,我們會(huì)有一個(gè)疑問(wèn):生命周期是抽象的,那么實(shí)際的任務(wù)如package,install等階段的任務(wù)都是怎么實(shí)現(xiàn)的呢?答案就是我們接下來(lái)要介紹的主角:插件(plugin)
生命周期的各個(gè)階段都是抽象的概念,真正干活的是一個(gè)個(gè)的插件,插件是以獨(dú)立的構(gòu)件形式存在,我們將maven的生命周期的各個(gè)階段與maven的插件進(jìn)行綁定,當(dāng)我們執(zhí)行mvn命令其實(shí)就是在指揮著一個(gè)個(gè)的插件在干活。
maven的插件以獨(dú)立的構(gòu)件形式存在,為了能夠復(fù)用代碼,使得一個(gè)插件可以完成多個(gè)任務(wù),我們定義了插件目標(biāo)(Plugin Goal),每一個(gè)目標(biāo)都可以完成不同的功能。
- maven-dependency-plugin插件具有多個(gè)功能,比如分析項(xiàng)目依賴(lài),還能列出項(xiàng)目的依賴(lài)樹(shù)等。就是使用了analyze, tree和list等插件目標(biāo)區(qū)分的。
- dependency : analyze
- dependency : tree
- denpendency : list
以上冒號(hào)左邊的表示插件前綴dependency,冒號(hào)右邊的表示插件的目標(biāo)Goal
- 3.1內(nèi)置綁定
maven的生命周期的各個(gè)階段與maven插件互相綁定,從而完成具體的構(gòu)件任務(wù)。default生命周期的compile階段與maven-compiler-plugin插件的目標(biāo)compile進(jìn)行綁定的示意圖如下所示:
為了能夠讓用戶更加方便的構(gòu)建項(xiàng)目,maven將大多數(shù)主要的生命周期階段都綁定了很多插件的目標(biāo)。如下所示:
執(zhí)行例子(以maven clean install為例)
由上圖可知,各個(gè)插件的執(zhí)行順序一般是:1:clean、2:resources、3:compile、4:testResources、5:testCompile、6:test、7:jar、8:install。在圖中標(biāo)記的地方每一行都是由冒號(hào)分隔的,前半部分是對(duì)應(yīng)的插件,后半部分是插件的執(zhí)行目標(biāo)也就是插件執(zhí)行產(chǎn)生的結(jié)果。現(xiàn)在我們來(lái)看下上面的pom文件,我們?nèi)缗渲昧薽aven-compiler-plugin這個(gè)插件,其它的插件沒(méi)有配置,但最后項(xiàng)目構(gòu)建成功,說(shuō)明maven內(nèi)置的各種插件,如果pom中沒(méi)有配置就調(diào)用默認(rèn)的內(nèi)置插件,如果pom中配置了就調(diào)用配置的插件。到此我們理解maven的構(gòu)建過(guò)程或者有更多的人稱(chēng)是打包,就是由各種插件按照一定的順序執(zhí)行來(lái)完成項(xiàng)目的編譯,單元測(cè)試、打包、布署的完成。各種插件的執(zhí)行過(guò)程也就構(gòu)成的maven的生命周期(lifecycle)。生命周期(lifecycle)各個(gè)階段并非不能獨(dú)立的,可以單獨(dú)執(zhí)行如mvn clean,也可以一起執(zhí)行如mvn clean install。而且有的mvn命令其是包括多個(gè)階段的,如mvn compile其是包括了resources和compile兩個(gè)階段。下面分別來(lái)分析各個(gè)階段需要的插件和輸出的結(jié)果
- clean插件maven-clean-plugin
clean階段是獨(dú)立的一個(gè)階段,功能就是清除工程目前下的target目錄,對(duì)應(yīng)的插件是 maven-clean-plugin,可以使用maven內(nèi)置的插件,當(dāng)然也可以自己在pom中配置。下面看下mvn執(zhí)行前后工程目錄下的輸出對(duì)比
- resources插件maven-resources-plugin
resource插件的功能就是把項(xiàng)目需要的配置文件拷貝到指定的目錄,默認(rèn)是拷貝src\main\resources目錄下的文件到classes目錄下,當(dāng)然可以自己來(lái)配置源目錄和輸出目錄。resources插件一般不單獨(dú)執(zhí)行,complie插件執(zhí)行時(shí)會(huì)先調(diào)用resources插件。配置示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>x.x</version> <executions> <execution> <id>copy-resources</id> <!-- 在default生命周期的 validate階段就執(zhí)行resources插件的copy-resources目標(biāo) --> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <!-- 指定resources插件處理資源文件到哪個(gè)目錄下 --> <outputDirectory>${project.build.outputDirectory}</outputDirectory> <!-- 也可以用下面這樣的方式(指定相對(duì)url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> --> <!-- 待處理的資源定義 --> <resources> <resource> <!-- 指定resources插件處理哪個(gè)目錄下的資源文件 --> <directory>src/main/${deploy.env}/applicationContext.xml</directory> <!-- 指定不需要處理的資源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> --> <!-- 是否對(duì)待處理的資源開(kāi)啟過(guò)濾模式 (resources插件的copy-resources目標(biāo)也有資源過(guò)濾的功能,這里配置的 這個(gè)功能的效果跟<build><resources><resource>下配置的資源過(guò)濾是一樣的,只不過(guò)可能執(zhí)行的階段不一樣, 這里執(zhí)行的階段是插件指定的validate階段,<build><resources><resource>下的配置將是在resources插件的resources目標(biāo)執(zhí)行時(shí)起作用(在process-resources階段)) --> <filtering>false</filtering> </resource> </resources> </configuration> <inherited></inherited> </execution> </executions> </plugin>- compile插件maven-compiler-plugin
compile插件執(zhí)行時(shí)先調(diào)用resouces插件,功能就是把src\mainjava源碼編譯成字節(jié)碼生成class文件,并把編譯好的class文件輸出到target\classes目錄下。下面看執(zhí)行結(jié)果:
- 單元測(cè)試所用插件
單元測(cè)試所用的compile和resources插件和主代碼是相同的,但執(zhí)行的目標(biāo)不同,目標(biāo)testCompile和testResources是把src\test\java下的代碼編譯成字節(jié)碼輸出到target\test-classes,同時(shí)把src\test\resources下的配置文件拷貝到target\test-classes。看下面的輸出:
- 插件maven-surefire-plugin執(zhí)行單元測(cè)試類(lèi)的
在本例中就是運(yùn)行contextLoads()方法,如果單元測(cè)試不通行,構(gòu)建會(huì)失敗,在編譯正式的項(xiàng)目時(shí)可以使用mvn -Dmaven.test.skip=true 來(lái)跳過(guò)測(cè)試類(lèi)的編譯和運(yùn)行過(guò)程。mvn test可以單獨(dú)執(zhí)行,但是這個(gè)命令其實(shí)是包括了resources、compile、testResources、testCompile、test這幾個(gè)階段,如下圖所示:
- 打包插件
這個(gè)插件是把class文件、配置文件打成一個(gè)jar(war或其它格式)包。依賴(lài)包是不在jar里面的,需要建立lib目錄,且jar和lib目錄在同級(jí)目錄。常用的打包插件有maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin三種,下面分別介紹下各自己pom配置和使用特點(diǎn)。
- maven-jar-plugin
可執(zhí)行jar與依賴(lài)包是分開(kāi),需建立lib目錄里來(lái)存放需要的j依賴(lài)包,且需要jar和lib目錄在同級(jí)目錄
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.6</version><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>com.xxx.xxxService</mainClass></manifest></archive></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>x.x</version><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin>- maven-assembly-plugin
這個(gè)插件可以把所有的依賴(lài)包打入到可執(zhí)行jar包。但是該插件有個(gè)bug會(huì)缺失spring的xds文件,導(dǎo)致無(wú)法運(yùn)行jar,同時(shí)如果同級(jí)目錄還有其它可執(zhí)行jar文件依賴(lài)可能會(huì)產(chǎn)生沖突。
<plugin><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><manifest><mainClass>com.xxx.xxxService</mainClass></manifest></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>- maven-shade-plugin
所有的依賴(lài)包打入到可執(zhí)行jar包,如果同級(jí)目錄有其它可執(zhí)行jar,依賴(lài)可能會(huì)產(chǎn)生沖突,且運(yùn)行jar時(shí),有時(shí)會(huì)出現(xiàn)SF、DSA、RSA文件沖突的提示,需要排除META-INF目錄下的文件。
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>x.x.x</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.tooling</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.xxx.xxxInvoke</mainClass></transformer></transformers><minimizeJar>true</minimizeJar><shadedArtifactAttached>true</shadedArtifactAttached></configuration></execution></executions></plugin>- 發(fā)布插件maven-install-plugin
發(fā)布插件的功能就是把構(gòu)建好的artifact部署到本地倉(cāng)庫(kù),還有一個(gè)deploy插件是將構(gòu)建好的artifact部署到遠(yuǎn)程倉(cāng)庫(kù)。
- 3.2 自定義綁定
前面說(shuō)了maven的內(nèi)置綁定,當(dāng)然maven為了滿足用戶多元化的構(gòu)建過(guò)程,是允許我們自定義的選擇將某個(gè)插件綁定到生命周期的某個(gè)階段的。接下來(lái),我們將maven-source-plugin插件的jar-no-fork任務(wù)綁定到verify生命周期階段,我們只需要在pom中增加如下的配置即可:
執(zhí)行:mvn verify
可以看到我們剛剛自定義的綁定插件maven-source-plugin的目標(biāo)jar-no-fork被執(zhí)行,并且在項(xiàng)目的構(gòu)建輸出的/target/下出現(xiàn)了-source包。
三、插件的配置
在項(xiàng)目的配置文件pom中,我們可以對(duì)插件進(jìn)行一個(gè)全局的配置,,我們可以在中配置來(lái)搞定,舉例如下:
<plugins> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.4</version><configuration><source>1.6</source><target>1.6</target><fork>true</fork><verbose>true</verbose><encoding>UTF-8</encoding><compilerArguments><sourcepath>${project.basedir}/src/main/java</sourcepath></compilerArguments><compilerArgument>-XDignore.symbol.file</compilerArgument></configuration></plugin></plugins>該配置表示我們要編譯Java1.6版本的源文件,生成與JVM1.6兼容的字節(jié)碼文件。
四、總結(jié)
本文闡述了maven中的兩個(gè)重要概念生命周期和插件。正是生命周期階段和插件的互相綁定,我們才能真正完成項(xiàng)目的構(gòu)建。常用的插件如下:有需要深入了解的可以自行查閱相關(guān)資料。
-
maven-assembly-plugin :自定義打包方式,還是很有趣的,感興趣的可以研究哦
-
maven-enforcer-plugin :展示項(xiàng)目依賴(lài)沖突
-
maven-antrun-plugin :運(yùn)行ant腳本
-
maven-dependency-plugin :分析項(xiàng)目依賴(lài)
-
maven-clean-plugin :清理
-
maven-compiler-plugin :編譯
-
maven-source-plugin :源碼
-
maven-war-plugin :打包
-
maven-jar-plugin:打包
-
maven-surefire-plugin :測(cè)試
-
maven-resources-plugin :資源文件處理
文章轉(zhuǎn)自
文章轉(zhuǎn)自
總結(jié)
以上是生活随笔為你收集整理的maven生命周期lifecycle和plugins介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows 包管理器scoop的使用
- 下一篇: 2020中国信息流平台品牌服务价值分析