Maven核心知識
阿新 • • 發佈:2018-07-04
生成 生命周期 包含 利用 archetype junit files groups optional
1.maven常用的構建命令
(1)mvn -v 查看maven版本
(2)compile 編譯
(3)test 測試
(4)package 打包
(5)clean 刪除target
(6)install 安裝jar包到本地倉庫中
2.maven自動建立目錄骨架
(1)archetype插件
- 用於創建符合maven規定的目錄骨架
- 先創建一個文件夾,其名為project名
(2)自動創建目錄方式一
- win+R,cmd,cd到該文件夾路徑下,輸入mvn archetype:generate,enter,第一次會自動下載一些相關依賴
- enter,輸入6
- ‘groupId‘ 輸入com.gc.maven;
- ‘artifactId‘輸入maven-service;
- ‘version‘輸入1.0.0SNAPSHOT;
- ‘package‘輸入com.gc.maven.service,
- enter,輸入y
- 至此自動創建成功
- 這是按照提示進行選擇的方法
(3)自動創建目錄方式二
- win+R,cmd,cd到該文件夾路徑下
- 輸入mvn archetype:generate -DgroupId=組織名,公司網址的反寫+項目名 -DartifactId=項目名-模塊名 -Dversion=版本號 -Dpackage=代碼所存在的包名
3.maven中的坐標和倉庫
(1)坐標
- 構件通過坐標作為其唯一標識
- groupId,artifactId,version組成項目的基本坐標
(2)倉庫
- 倉庫管理項目的依賴
- 本地倉庫和遠程倉庫:打開maven—>lib—>maven-model-builder-3.5.4.jar,用360壓縮打開,org—>apache—>maven—>model—>pom-4.0.0.xml,打開,找到<url>https://repo.maven.apache.org/maven2</url>,即為遠程倉庫
- 鏡像倉庫:打開maven—>conf—>settings.xml,找到mirrors,配置1-2個鏡像
<mirror> <id>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror>
- 更改倉庫位置:默認本地倉庫在c盤中C:\Users\guochan\.m2,如果重裝系統可能丟失,所以要更改倉庫位置
- 創建一個本地文件夾其路徑為E:\maven\repo,打開maven—>conf—>settings.xml,找到localRepository,
- <localRepository>E:/maven-3.5.0/repository</localRepository>
- win+R cmd ,輸入命令mvn compile測試是否成功
4.在Intellij IDEA中配置maven以及創建maven項目
(1)配置maven
- Ctrl+Shift+A,輸入maven,選擇maven settings
- 在maven home directory中選擇maven文件夾目錄,我這裏是D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
- 在user setting file中選擇override,填入修改好本地倉庫位置的配置文件,我這裏是D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
- local repository會自動檢測到修改過的本地倉庫路徑
- 在settings搜索框中輸入runner,找到maven下的runner,在VM Options中輸入-DarchetypeCatalog=internal,如果未配置會導致maven 骨架生成速度緩慢
- 配置完成
- File—>other settings—>default settings,再將剛才配置一遍,在創建maven項目的時候就不用重復配置了
(2)創建maven web項目
- File—>New—>Project,選擇maven,在create from archetype打勾,選擇,next
- 輸入groupId和artifactId,next
- 仍然選擇maven home directory為D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
- user setting file選擇override,為D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
- local repository會自動檢測到修改過的本地倉庫路徑
- 上述加下劃線的三步如果在default settings中配置過即可忽略
- 點綠色的+,Name中輸入archetypeCatalog,Value中輸入internal,OK(該屬性設置可以加快項目創建速度),next,finish
- 如果創建maven項目失敗,錯誤[ERROR] Maven execution terminated abnormally (exit code 1)
- 原因:如果path裏有兩個java環境,則會導致創建失敗
- 解決辦法:查看Path路徑下發現有C:\ProgramData\Oracle\Java\javapath和%JAVA_HOME%\bin這兩個java環境,刪除C:\ProgramData\Oracle\Java\javapath即可正常創建
- 創建好的項目結構缺少一些文件夾,手動補全,Alt+Insert,按照上一篇的目錄結構添加directory,在main下添加java和resources,在src下添加test和resources
- Ctrl+;調出Project Structure,點擊Modules,main下的java選擇Sources,main下resources選擇Resources;test下的java選擇Tests,test下的resources選擇Test Resources
5.maven的生命周期和插件
(1)完整項目的構建過程
- 清理、編譯、測試、打包、集成測試、驗證、部署
(2)maven生命周期
- clean 清理項目
- pre-clean 執行清理前的工作
- clean 清理上一次構建生成的所有文件
- post-clean 執行清理後的文件
- default 構建項目(最核心)
- compile
- test
- package
- install
- site 生成項目站點
- pre-site 在生成項目站點前要完成的工作
- site 生成項目的站點文檔
- post-site 在生成項目站點後要完成的工作
- site-deploy 發布生成的站點到服務器上
(3)maven的插件
- 詳細插件信息可查看http://maven.apache.org/plugins/index
- 下面以使用source插件為例,希望運行package時即可將源碼打包,在pom.xml中寫入
<build> <plugins> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.4.0</version> <executions> <execution> <phase>package</phase> <goals>jar-no-fork</goals> </execution> </executions> </plugin> </plugins> </build>
- 其中goals可以從上述網站中查看
6.maven中pom.xml解析
<?xml version="1.0" encoding="UTF-8"?> <!--project是pom.xml的根元素,包含pom約束的信息--> <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"> <!--指定當前pom的版本,也是必不可少的元素--> <modelVersion>4.0.0</modelVersion> <groupId>反寫的公司網址+項目名</groupId> <artifactId>項目名+模塊名</artifactId> <!--第一個0表示大版本號 第二個0表示分支版本號 第三個0表示小版本號 0.0.1 snapshot 快照 alpha 內部測試 beta 公測 Release 穩定 GA 正式發布 --> <version>1.0-SNAPSHOT</version> <!--jar war zip pom--> <packaging>war</packaging> <name>項目描述名</name> <url>項目地址</url> <description>項目描述</description> <developers>開發人員列表</developers> <licenses>開源框架許可證信息</licenses> <organization>組織信息</organization> <!--依賴列表--> <dependencies> <!--依賴項--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <type></type> <!--依賴範圍 test表示junit只在測試的依賴範圍內有用,在main主代碼中引用junit會報錯--> <scope>test</scope> <!--設置依賴是否可選,有true和false,默認是false,子項目繼承,若為true,子項目必須顯示引入該依賴--> <optional>false</optional> <!--排除依賴傳遞列表--> <exclusions> <exclusion> </exclusion> </exclusions> </dependency> </dependencies> <!--依賴的管理,主要定義在父模塊中,供子模塊繼承--> <dependencyManagement> <!--依賴列表--> <dependencies> <!--多個依賴,但這些依賴並不會被運行,不會被引入實際的依賴中--> <dependency> </dependency> </dependencies> </dependencyManagement> <!--對構件行為提供相應的支持--> <build> <!--插件列表--> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> </plugin> </plugins> <!--通常用於子模塊對父模塊pom的繼承--> <parent></parent> <!--用來聚合運行多個maven項目,使很多maven模塊一起編譯--> <modules> <module></module> </modules> </build> </project>
7.maven依賴範圍
(1)<scope>
- maven的依賴範圍
- 開發時使用某一框架,將該項目的jar包引入到項目的classpath路徑中,項目即可使用該框架為我們封裝好的一些方法
- 依賴範圍就是控制依賴與classpath的關系
(2)maven中的classpath
- 編譯
- 測試:例如junit依賴範圍中的值test表明junit只存在於測試的classpath中
- 運行
(3)scope的值
- 打開http://maven.apache.org/,點擊右側欄中的Documentation-Index(category),點開Introductions-The Dependency Mechanism(依賴機制),找到Dependency Scope
- 有6種scope的值,介紹如下
- compile:默認的範圍,在編譯、測試、運行時都有效。
- provided:在編譯、測試時有效。例子:Servlet API加載,運行時不會被加入,因為web容器已經包含了這些API,如果加入進去會導致沖突。
- runtime:在測試、運行時有效。例子:jdbc驅動的實現,項目主代碼的編譯只需要JDK提供的jdbc的API,只有在執行測試和運行項目的時候才需要實現接口的具體的jdbc驅動。
- test:只在測試時有效。例子:junit。
- system:與provided相同,在編譯,測試時有效,與本機系統相關聯,可移植性差,換機子以後可能會出問題。比如我們要引用本機的JAVA_HOME,如果把項目移植到其他系統上,可能由於路徑的不一致而導致錯誤。
- import:導入的依賴範圍,它只使用在dependencyManagement中,表示從其他的pom中導入dependency配置(是從其他pom中繼承的依賴)。
8.maven依賴傳遞
(1)依賴傳遞的例子
- 假設A依賴於B,B依賴於C
- 首先在B的pom.xml中添加B對C的依賴
<dependency> <groupId>com.gc.C</groupId> <artifactId>C</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- 再在A的pom.xml中添加A對B的依賴
<dependency> <groupId>com.gc.B</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
- 然後對C clean package(生成C的jar包) install(C的jar包安裝到本地倉庫中);再對B clean package(生成B的jar包) install(B的jar包安裝到本地倉庫中)
- 對A clean compile,即會發現在A的Maven Dependencies中有B.jar和C.jar。在A的pom.xml中並沒有配置C,所以這就是傳遞依賴
(2)排除依賴
- 若A只想依賴於B,不想依賴於C,則可在A的pom.xml中加入exclusion,這樣A中Maven Dependencies就自動去除了C.jar
<dependency> <groupId>com.gc.B</groupId> <artifactId>B</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>com.gc.C</groupId> <artifactId>C</artifactId> </exclusion> </exclusions> </dependency>
9.maven依賴沖突
(1)產生依賴沖突的場景
- A和B依賴了不同版本的相同的構件,那麽對依賴A、B的C來說依賴的是哪個版本的構件,這就產生了依賴沖突
(2)兩條原則
- 短路優先
- A—>B—>C—>X(jar)
- A—>D—>X(jar),選擇此依賴
- 先聲明先優先
- 如果路徑長度相同,則誰先聲明,先解析誰
10.maven聚合和繼承
(1)使用聚合的場景:
- maven中將多個項目install,將其安裝到本地倉庫中,聚合可以將他們放到一起運行,稱為聚合
(2)聚合的例子:
- 想要將項目A,B,C一起install到本地倉庫中
- 新建一個新的maven項目D,其pom.xml如下
<packaging>pom</packaging> <modules> <module>../A</module> <module>../B</module> <module>../C</module> </modules>
- 對D的pom.xml clean install,即可將A,B,C生產jar包並安裝到本地倉庫中
- D的pom.xml作為其他項目pom的容器
(3)使用繼承的場景:
- 很多項目的pom.xml中有很多重復的配置,例如junit等,可以利用繼承減少配置
(4)繼承的例子:
- 假設有parent項目和sub項目,則分別配置parent和sub的pom.xml
- 新建一個新的maven項目parent,其pom.xml如下
<packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.11</junit.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
- 在sub項目中的pom.xml修改如下(將junit中的version和scope刪除):
<parent> <groupId>com.gc.parent</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>
- 此時junit就可以從parent的pom中繼承過來
Maven核心知識