日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

maven(7)生命周期和插件

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maven(7)生命周期和插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README 1)本文部分文字轉自 “maven實戰”,旨在 review ?“maven(7)生命周期和插件”?的相關知識; 2)maven 另外兩個核心概念是生命周期和插件:maven的生命周期是抽象的,其實際行為都由插件來完成,如package階段的任何可能都會由 maven-jar-plugin 完成;
【1】何為生命周期 1)intro:maven 的 生命周期就是為了對所有的構建過程進行抽象和統一; 2)maven的生命周期: 生命周期本身不做任何實際的工作,都是交由 插件來完成。這種idea 和 模板方法非常相似;模板方法模式在父類中定義算法的整體結構,子類可以通過實現或重寫父類方法來控制實際的行為,這樣既保證了算法有足夠的可擴展性,又能夠嚴格控制算法的整體結構;(干貨——review 模板方法模式)
3)problem+solutions: 3.1)problem:生命周期抽象了構建的 各個steps,定義了它們的次序,但沒有提供具體實現。那么誰來實現這些step 呢? 3.2)solutions:maven 當然必須要考慮這一點,因此它設計插件機制。每個構建step 都可以綁定一個或者多個插件行為,而且maven 為大多數構建step 編寫并綁定了 默認插件;
【2】生命周期詳解 1)intro:要了解生命周期的具體定義和使用方式;
【2.1】三套生命周期 1)intro:maven 擁有3套相互獨立的生命周期(lifecycle):分別是 clean,default, site。 lifecycle1)clean 生命周期: 的目的是清理項目 lifecycle2)default生命周期:的目的是構建項目 lifecycle3)site 生命周期: 的目的是建立項目站點; Attention) A1)每個生命周期包含一些階段:以clean 生命周期為例,包含的 階段有pre-clean, clean 和 post-clean; A2)三套生命周期本身是相互獨立的,用戶可以僅僅調用clean生命周期的某個階段,或者僅僅調用 default 生命周期短某個階段,而不會對其他生命周期產生任何影響;
【2.2】clean 生命周期 1)intro:clean 生命周期包含3個階段(stage) stage1)pre-clean:清理前需要完成的工作; stage2)clean:清理上一次構建生成的文件; stage3)post-clean:清理后需要完成的工作;
【2.3】default 生命周期 1)intro:default 生命周期定義了 真正構建時所需要執行的所有steps,它是所有生命周期中最核心的部分,其包含的階段如下(stages),只對重要的進行解釋:


【2.4】site 生命周期 1)intro:site生命周期的目的是建立和發布項目站點,maven 能夠基于POM 所包含的信息,自動生成一個友好的站點; 2)該生命周期包含如下的 stages:
【2.5】命令行與生命周期 1)intro:從命令行執行maven任務的最主要方式就是調用 maven 的生命周期階段。需要注意的是,各個生命周期是相互獨立的,而一個生命周期的階段是有前后依賴關系的。 2)下面以常見的maven 命令為例,解釋其執行的生命周期階段:


【3】插件目標 1)intro:maven的核心僅僅定義了 抽象的生命周期,具體的任務是 交由插件完成的,插件以獨立的構件形式存在,因此,maven 核心的分發包只有不到 3MB 大小,maven 會在需要的時候下載并使用插件; 2)對于插件: 為了能夠復用代碼,它往往能夠完成多個任務;(干貨——一個插件完成多個任務) 3)因為任務背后有很多可以復用的代碼,即不同任務的實現代碼有一部分是相同的,可以復用的,因此,多個功能聚集在一個插件里,每個功能就是一個插件目標;(干貨——一個插件有多個功能,有多個目標,一個功能 == 一個目標)
4)看個荔枝: maven-dependency-plugin有多個目標 4.1)intro:?maven-dependency-plugin有多個目標,每個目標對應一個功能,上述提到的幾個功能分別對應的插件目標為 dependency:analyze, dependency:tree 和 dependency:list; 4.2)這是一種通用的寫法: 冒號前面是 插件前綴,后面是該插件的目標;(干貨——引入了插件前綴)
【4】插件綁定 1)intro:具體而言,是生命周期的階段與 插件的目標相互綁定,以完成某個具體的構建任務;如下圖所示: 【4.1】內置綁定 1)intro:為了讓用戶幾乎不用任何配置就構建maven 項目,maven 在核心為一些主要的生命周期綁定了很多插件的目標; 2)clean 和 site 生命周期 階段與插件目標的綁定關系如下圖所示:
3)default 生命周期 階段與插件目標的綁定關系如下圖所示:
對上表的分析(Analysis) A1)default 與插件目標的綁定關系是由 項目打包類型所決定的,打包類型是通過 POM 中的 packaging 元素定義的; A2)除了默認的 jar 打包類型外,常見的打包類型還有 war,pom,maven-plugin,ear等;
4)看個荔枝: mvn clean install, maven 會輸出包含了生命周期階段與 插件的綁定關系 D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn clean install [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 22, column 15 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. [WARNING] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building service says hello maven. 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ service --- [INFO] Deleting D:\classical_books\java_set\maven_in_action\mycode\chapter3\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ service --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ service --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! [INFO] Compiling 1 source file to D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ service --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ service --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent! [INFO] Compiling 1 source file to D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ service --- [INFO] Surefire report directory: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\surefire-reports -------------------------------------------------------T E S T S ------------------------------------------------------- Running com.maven.chapter3.service.HelloTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ service --- [INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:1.2.1:shade (default) @ service --- [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar with D:\classical_books\java_set\maven_in _action\mycode\chapter3\target\service-1.0-SNAPSHOT-shaded.jar [INFO] [INFO] --- maven-install-plugin:2.4:install (default-install) @ service --- [INFO] Installing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar to D:\classical_books\java_set\maven_in_ action\local_repo\com\maven\chapter3\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.jar [INFO] Installing D:\classical_books\java_set\maven_in_action\mycode\chapter3\pom.xml to D:\classical_books\java_set\maven_in_action\local_repo\com\ma ven\chapter3\service\1.0-SNAPSHOT\service-1.0-SNAPSHOT.pom [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.305 s [INFO] Finished at: 2016-06-22T18:43:41+08:00 [INFO] Final Memory: 17M/142M [INFO] ------------------------------------------------------------------------

【4.2】自定義綁定 1)intro: 除了內置綁定外,用戶可以自己選擇將某個 目標綁定到 生命周期的某個階段上; 2)看個荔枝:創建項目的源碼jar 包,內置的插件綁定關系中并沒有內置這一項任務,因此需要用戶自行配置。 maven-source-plugin 可以幫助我們完成這項任務;它的 jar-no-fork 目標能夠將項目的主代碼打包成jar 文件,可以將其綁定到 default 生命周期的verify 階段上; <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.1.1</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin> 對以上代碼的分析(Analysis):
A1)executions 下每個execution 子元素可以用來配置執行一個任務; A2)該例中配置了一個id 為 attach-sources 的 任務,通過 phrase 配置,將其綁定到 verify 生命周期階段上,再通過 goal 配置指定要執行的插件 目標,至此,自定義插件配置完成了;(干貨——總結了自定義插件配置的steps)
3)運行 mvn verify 看如下輸出: D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn verify [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building the effective model for com.maven.chapter3:service:jar:1.0-SNAPSHOT [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 22, column 15 [WARNING] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build. [WARNING] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects. [WARNING] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building service says hello maven. 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.pom (5 KB at 2.6 KB/sec)Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/14/maven-plugins-14.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/14/maven-plugins-14.pom (13 KB at 32.4 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-source-plugin/2.1.1/maven-source-plugin-2.1.1.jar (24 KB at 59.4 KB/se c) [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ service --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ service --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ service --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory D:\classical_books\java_set\maven_in_action\mycode\chapter3\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ service --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ service --- [INFO] Surefire report directory: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\surefire-reports-------------------------------------------------------T E S T S ------------------------------------------------------- Running com.maven.chapter3.service.HelloTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ service --- [INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:1.2.1:shade (default) @ service --- [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT.jar with D:\classical_books\java_set\maven_in _action\mycode\chapter3\target\service-1.0-SNAPSHOT-shaded.jar [INFO] [INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources) @ service --- // maven-source-plugin:jar-no-fork 會得以執行. Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.pom (4 KB at 9.1 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/10/maven-shared-components-10.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/shared/maven-shared-components/10/maven-shared-components-10.pom (9 KB at 19.0 KB/se c) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact/2.0/maven-artifact-2.0.pom (723 B at 1.8 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven/2.0/maven-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven/2.0/maven-2.0.pom (9 KB at 21.5 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.0/maven-model-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/2.0/maven-model-2.0.pom (3 KB at 6.2 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.0/maven-project-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-project/2.0/maven-project-2.0.pom (2 KB at 4.1 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.0/maven-profile-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-profile/2.0/maven-profile-2.0.pom (2 KB at 3.6 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-artifact-manager/2.0/maven-artifact-manager-2.0.pom (2 KB at 3.6 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.pom (2 KB at 3.1 KB/sec)Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-11/plexus-archiver-1.0-alpha-11.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-11/plexus-archiver-1.0-alpha-11.pom (2 KB at 4.5 KB/sec ) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-components/1.1.9/plexus-components-1.1.9.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-components/1.1.9/plexus-components-1.1.9.pom (3 KB at 6.3 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.10/plexus-1.0.10.pom (9 KB at 21.0 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-15/plexus-container-default-1.0-alpha-15.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-container-default/1.0-alpha-15/plexus-container-default-1.0-alpha-15.pom ( 2 KB at 4.1 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-15/plexus-containers-1.0-alpha-15.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-15/plexus-containers-1.0-alpha-15.pom (2 KB at 4.9 KB /sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus/1.0.9/plexus-1.0.9.pom (8 KB at 19.9 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-15/plexus-component-api-1.0-alpha-15.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-15/plexus-component-api-1.0-alpha-15.pom (948 B at2.4 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-6/plexus-classworlds-1.2-alpha-6.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-6/plexus-classworlds-1.2-alpha-6.pom (3 KB at 6.1 KB /sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.3/plexus-utils-1.3.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.3/plexus-utils-1.3.pom (2 KB at 2.6 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-3/plexus-io-1.0-alpha-3.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-3/plexus-io-1.0-alpha-3.pom (2 KB at 3.7 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-component-api/1.0-alpha-16/plexus-component-api-1.0-alpha-16.pom (3 KB at 5.7 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-containers/1.0-alpha-16/plexus-containers-1.0-alpha-16.pom (2 KB at 4.8 KB /sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-classworlds/1.2-alpha-7/plexus-classworlds-1.2-alpha-7.pom (3 KB at 6.1 KB /sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.4.9/plexus-utils-1.4.9.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.4.9/plexus-utils-1.4.9.pom (3 KB at 5.8 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.pom (3 KB at 7.1 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.pom (2 KB at 4.7 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.pom Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.pom (2 KB at 3.3 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.jar Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.jar Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.jar Downloading: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/maven-archiver/2.4/maven-archiver-2.4.jar (20 KB at 46.2 KB/sec) Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-io/1.0-alpha-1/plexus-io-1.0-alpha-1.jar (12 KB at 15.5 KB/sec) Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-interpolation/1.6/plexus-interpolation-1.6.jar (50 KB at 43.3 KB/sec) Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-archiver/1.0-alpha-9/plexus-archiver-1.0-alpha-9.jar (154 KB at 116.1 KB/s ec) Downloaded: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/1.5.8/plexus-utils-1.5.8.jar (262 KB at 95.3 KB/sec) [INFO] Building jar: D:\classical_books\java_set\maven_in_action\mycode\chapter3\target\service-1.0-SNAPSHOT-sources.jar // 生成了源碼文件. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 18.822 s [INFO] Finished at: 2016-06-22T19:00:32+08:00 [INFO] Final Memory: 13M/171M [INFO] ------------------------------------------------------------------------
對以上console info的分析(Analysis):可以看到, 當執行 verify 生命周期階段的時候,maven-source-plugin:jar-no-fork 會得以執行,它會創建一個以 -sources.jar 結尾的源碼文件包;
4)problem+solutions: 4.1)problem:當插件目標被綁定到不同的生命周期的時候,其執行順序會由生命周期階段的先后順序決定;當多個目標被綁定到同一階段時,他們的執行順序會是怎樣? 4.2)solutions:當多個插件目標綁定到同一個階段的時候,這些插件聲明的先后順序決定了目標的執行順序;
【5】插件配置 1)intro:幾乎所有maven 插件的目標都有一些可配置的參數,用戶可以通過 命令行 和 POM 配置等方式來配置這些參數;
【5.1】 命令行插件配置 1)problem+solutions: 1.1)problem:如何從命令行配置插件? 1.2)solutions:用戶可以在maven 命令中使用 -D 參數,并伴隨一個參數鍵=參數值的形式,來配置插件目標的參數;參數-D 是java 自帶的,其功能是通過命令行設置一個 java 系統屬性;(干貨——參數-D 是java 自帶的,其功能是通過命令行設置一個 java 系統屬性 2)看個荔枝: mvn install-Dmaven.test.skip=true : 跳過測試;
【5.2】POM 中插件全局配置 1)intro:在pom 文件中一次性配置顯然要比在命令行中輸入參數要方便; 2)用戶可以在聲明插件的時候,對此插件進行一個全局配置。也就是說,所有基于該插件目標的任務,都會使用這些配置; 3)看個荔枝:告訴maven 基于 jdk1.8 編譯該文件. <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin> 【5.3】 POM中插件任務配置 1)intro:用戶可以為某個插件任務配置特定的參數; 2)看個荔枝: <?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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion> <groupId>com.maven.chapter3</groupId> <artifactId>service</artifactId> <version>1.0-SNAPSHOT</version> <name>service says hello maven.</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.2.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration> <transformers><transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.maven.chapter3.service.Hello</mainClass></transformer></transformers></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.1.1</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId><version>1.3</version><executions><execution><id>ant-validate</id><phase>validate</phase><goals><goal>run</goal></goals><configuration><tasks><echo>i am bound to validate phase.</echo></tasks></configuration></execution><execution><id>ant-verify</id><phase>verify</phase><goals><goal>run</goal></goals><configuration><tasks><echo>i am bound to verify phase.</echo></tasks></configuration></execution></executions></plugin></plugins></build> </project> 對以上代碼的分析(Analysis): A1)maven-antrun-plugin:run 與 validate 階段綁定,從而構成了一個id為 ant-validate 的任務; A2)插件 全局配置中的 configuration 元素位于 plugin 元素下面,而這里的configuration元素則位于 execution 元素下,表示這是 特定任務的配置,而非插件整體的配置; A3)ant-validate任務配置了一個 echo 任務,而id為 ant-verify 任務也配置了一個 echo?任務;
【6】獲取插件信息 1)intro:當遇到一個構件任務的時候,用戶還需要知道到哪里去尋找合適的插件,以幫助完成任務;
【6.1】在線插件信息 1)intro:基本上所有的插件都來自 apache 和 codehaus; 2)插件詳細的列表在這個地址得到: http://maven.apache.org/plugins/index.html http://repo1.maven.org/maven2/org/apache/maven/plugins/
3)看個荔枝:以 maven-surefire-plugin 為例,訪問?https://maven.apache.org/surefire/maven-surefire-plugin/, 可以看到該插件的簡要intro, 包含的目標,使用介紹;

Attention)并不是所有插件目標參數都有表達式,也就是說,一些插件目標參數只能在 POM 中配置;
【6.2】使用 maven-help-plugin 描述插件 1)intro:運行以下命令來獲取 ?maven-compiler-plugin2.1 ?版本的信息:

2)值得一提的是 目標前綴:其作用是方便在命令行直接運行插件;(干貨——引入了目標前綴) 2.1)看個荔枝: maven-compiler-plugin 的目標前綴是 compiler。 2.2)在描述插件的時候,還可以省去版本信息,讓 maven 自動獲取最新版本來進行表述, 如: mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin 2.3)進一步簡化:可以使用插件目標前綴來替換坐標: mvn help:describe-Dplugin=compiler 2.4)想僅僅描述某個插件目標的信息,可以加上 goal 參數: mvn help:describe-Dplugin=compiler-Dgoal=compile 2.5)想讓 ?maven-help-plugin 輸出更詳細的信息,可以加上 detail參數: mvn help:describe-Dplugin=compiler-Ddetail
【7】 從命令行調用插件 1)intro:運行mvn -h 來顯示 mvn 命令幫助: D:\classical_books\java_set\maven_in_action\mycode\chapter3>mvn -h usage: mvn [options] [<goal(s)>] [<phase(s)>] 2)我們可以通過mvn 命令激活生命周期階段,從而執行那些綁定在生命周期階段上的插件目標; 3)maven 還支持:直接從命令行調用插件目標,因為這些任何不適合綁定在生命周期上,這些插件目標應該通過如下方式使用: mvn help:describe-Dplugin=compiler mvn dependency:tree 4)problem+solutions: 4.1)problem:為什么不是 mavnen-dependency-plugin:tree 而是 dependency:tree ? 4.2)solutions:可以嘗試如下命令: mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe-Dplugin=compiler mvn org.apache.maven.plugins:maven-dependency-plugin:2.1:tree 4.2.1)上面的命令一對比,顯然 前面的目錄更加簡潔,更容易使用; 4.2.2)這也是 maven 引入 目標前綴的原因: help 是 maven-help-plugin 的目標前綴, 而 dependency 是 maven-dependency-plugin 的前綴,有了插件前綴,maven 就能夠找到對應的 artifactId;不過 除了 artifactId ,maven 還需要得到 groupId 和 version 才能確定到 某個插件;
【8】插件解析機制 【8.1】插件倉庫 1)intro:與依賴構建一樣,插件構件同樣基于坐標存儲在 maven 倉庫中:在需要的時候,maven 會從本地倉庫中尋找插件,如果不存在,則從遠程插件倉庫查找。找到插件后,再下載到 本地倉庫使用; 2)maven 會 區別對待依賴的遠程倉庫與插件的遠程倉庫:當maven 需要的依賴在本地倉庫不存在時,它會去所配置的遠程倉庫中查找,可是當 maven 需要的插件在本地倉庫中不存在時,它就不會去 這些遠程倉庫中查找; 3)插件的遠程倉庫使用 pluginRepositories 和 pluginRepository 配置,maven 內置了如下的插件遠程倉庫配置;
【8.2】插件的默認 groupId 1)intro:在 pom 中配置插件的時候,如果該插件是 maven 的官方插件,就可以省略 groupId 配置,見如下代碼:(Attention——原書作者不推薦這種做法,即望補全groupId)

【8.3】解析插件版本 1)intro:maven 在超級POM 中為所有核心插件設定了版本,超級 POM 是所有maven 項目的父 POM,所有項目都繼承這個超級 POM 的配置,因此,即使用戶不加任何配置,maven 使用核心插件的時候,他們的版本就已經確定了; 2) 如果用戶使用某個插件的時候沒有設定版本,而這個插件又不屬于 核心插件的范疇, maven 就會去 檢查所有 倉庫中可用的版本,然后做出選擇; 3)依賴maven 解析插件版本是不推薦的做法: 即使 maven3 將版本解析到最新的非快照版,其還是存在潛在的不穩定性;
【8.4】 解析插件前綴 1)intro:maven 如何 根據插件前綴解析得到插件的坐標; 2)插件前綴用戶 groupId:artifactId 是一一對應的,這種匹配關系存儲在倉庫元數據中; 3)maven在解析插件倉庫元數據的時候,會默認使用 org.apache.maven.plugins 和 org.codehaus.mojo 兩個 groupId。也可以通過配置 settings.xml 讓 maven 檢查其他groupId 上的 插件倉庫元數據: <settings><pluginGroups><pluginGroup>com.your.plugins</pluginGroup></pluginGroups> </settings>對以上代碼的分析(Analysis): maven 不僅僅會檢查 org/apache/maven/plugins/maven-metadata.xml 和 ?org/codehaus/mojo/maven-metadata.xml ,還會檢查 com/your/plugins/maven-metadata.xml; 4)看看插件倉庫元數據的內容,如下:
對以上代碼的分析(Analysis):? A1)上述內容是從 中央倉庫的 org.apche.maven.plugins groupId 下插件倉庫元數據中截取的一些片段,從這段數據中就能看到 maven-clean-plugin 的前綴為 clean,maven-compile-plugin 的前綴為 compiler, maven-dependency-plugin 的前綴為 dependency; A2)當maven 解析到 dependency:tree 這樣的命令后,他首先基于 默認的 groupId 歸并所有插件倉庫的元數據 org/apache/maven/plugins/maven-metadata.xml; 其次檢查歸并后的元數據, 找到對應的 artifactId 為 maven-dependency-plugin; 然后結合當前元數據的 groupId org.apache.maven.plugins;最后使用 章節8.3 的方法解析得到 version,從而得到完整的插件坐標;

總結

以上是生活随笔為你收集整理的maven(7)生命周期和插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。