1: maven是什么?
maven是Apache公司的開源項目疫赎,是一個服務于Java項目的自動化構建工具盛撑,用來管理依賴與項目。
2: 好處
- 與傳統(tǒng)項目相比捧搞,使用maven工程只會有自己編寫的文件抵卫,不再項目中直接依賴本地jar,項目占用內(nèi)存會很小。
- maven的兩大核心:依賴管理->對Jar包的管理胎撇, 項目構建->
3:maven項目構建
原始的我們使用IDE給我們的界面進行項目的構建介粘,編譯,與發(fā)布晚树,maven可以不依賴與IDE姻采,通過命令在編碼完成后就可以對項目進行編譯,測試爵憎,打包慨亲,部署,
3.1: maven項目標準目錄結構
eg: 以簡單的helloworld為例宝鼓,在沒有IDE文件生成的情況下目錄結構是這樣的
- ?helloworld
- ---- src 項目的源碼
- ---- main 我們主要的編寫的源代碼
- ---- Java Java源代碼目錄
- ---- resource 項目資源目錄刑棵,配置文件等
- ---- webapp web項目的網(wǎng)頁資源目錄
- ---- main 我們主要的編寫的源代碼
- ---- test 做單元測試的源代碼
- ---- Java 測試Java源代碼目錄
- ---- resource 測試的資源目錄, 一般不使用愚铡。
- ---- pom.xml maven項目的核心配置文件
注:在沒有配置的情況下蛉签,一般目錄下都會有一個target目錄,這個目錄是項目編譯后生成的目錄沥寥,用于保存編譯生成的文件碍舍,我們不需要考慮,他不是maven標準目錄結構营曼,
- ---- src 項目的源碼
3.2: pom.xml文件
pom->Project Object Model項目對象模型 乒验, 為xml文件,以各個節(jié)點定義約束maven的項目管理蒂阱,是maven項目的核心配置文件锻全,與構建過程相關的配置都在這個文件中狂塘。eg:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--自己工程的配置,組鳄厌,模塊荞胡,版本 名字,描述-->
<groupId>com.tian.learn</groupId>
<artifactId>SpringBoot-Learn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringBoot-Learn</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4. maven 依賴包的實現(xiàn)(依賴管理)
maven并不是不再使用所以依賴的jar包了嚎,而是做了遠程依賴管理泪漂,
4.1: maven的遠程實現(xiàn)
maven存在一個遠程倉庫,這個倉庫中包含著各種各樣的jar包歪泳,以供我們下載使用萝勤,我們可以
直接通過瀏覽器訪問公共maven`倉庫,直接下載自己需要的jar包呐伞,在maven中敌卓,可以通過配置
maven文件,在編譯項目時伶氢,maven就會自動幫我們下載這些jar包趟径,并添加到項目中,是項目
編譯完成,但這些jar包并不會出現(xiàn)在我們的項目中,他會緩存在你的電腦的其他目錄峦朗,所以你的
項目看起來仍舊沒有任何jar包,在Linux中下載的jar包一般存在用戶目錄的.m2文件夾中梭冠。
4.2: maven中jar的定位
maven倉庫中每個jar包都有其坐標,就像我們的一樣,我們的地理位置是一步一步縮小
的,eg:北京市朝陽區(qū)xx大街香嗓,我們的jar坐標也是這樣的迅腔,例如fastjson包装畅,在
maven中配置為:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
可以看到引入一個包需要三個值確定,一般我們命名時是沧烈,groupId(com.公司名+項目名),artifactId(模塊名)掠兄, version(模塊的版本號)。通過這三個坐標我們就能引入一個jar包锌雀。
5: 倉庫
5.1: 倉庫保存的文件
- Maven自身所需要的插件
- 第三方礦建或者工具的jar包
- 我們自己開發(fā)的maven工程
5.2: 倉庫類型
maven為了項目構建的方便蚂夕,實現(xiàn)了三種倉庫,
- 本地倉庫:程序員自己電腦上的倉庫腋逆,一般你通過maven配置過的jar都會存在這里婿牍,也是maven自己首先要找的地方。
- 私有倉庫:公司為了保存公司使用的全部的jar而建立的自己的倉庫惩歉,一般都是存在與公司局域網(wǎng)內(nèi)等脂,也可以保存公司自己的不方便方便發(fā)布到中央倉庫的jar俏蛮。
- 中央倉庫:存在與互聯(lián)網(wǎng),幾乎多有的公共的jar都存在與這里上遥,我們需要的jar一般也在這里下載到私有倉庫或者我們的本地倉庫搏屑。
- 中央倉庫的鏡像:與中央倉庫一樣,只是不同的網(wǎng)絡地址粉楚,是中央倉庫的另一份辣恋。
jar加載順序:每次我們配置我們需要的jar時,maven都會由小及大的尋找我們的jar模软,先從本地倉庫伟骨,再到私有倉庫,最后才從中央倉庫尋找燃异,那個倉庫先尋到就從那個倉庫下載底靠。
6:maven的常用命令
- mvn clean: 清理某個項目編譯生成的文件,一般會刪除target目錄 特铝。
- mvn compile: 編譯暑中,將項目中的Java文件編譯為.class文件。
- mvn test : 執(zhí)行單元測試方法鲫剿,
- mvn test-compile: 編譯單元測試程序
- mvn package: 項目打包操作鳄逾,項目不同打包生成不同的包,分web項目war包灵莲,Java項目jar包
- mvn install : 同樣是打包操作雕凹,但是打包后會將打包的文件同步到程序員的本地倉庫。
7:maven項目的聲明周期
在執(zhí)行maven項目的install命令時就會完全執(zhí)行maven的生命周期政冻,但maven的各個生命周期又相互獨立枚抵,可以單獨執(zhí)行。
- CleanLifeCycle:清理生命周期明场,就是clean命令周期
- pre-clean: 執(zhí)行一些需要在clean之前完成的工作
- clean: 移除所有上一次構建生成的文件
- post-clean:執(zhí)行一些需要在clean之后馬上完成的工作汽摹。
- defaultListCycle: 默認的生命周期
? 編譯(compile)、測試(test)苦锨、打包(package)逼泣、下載(install)、部署(deploy) - siteLifeCycle:站點聲明周期
- pre-site:執(zhí)行一些需要在生成站點文檔之前完成的工作舟舒。
- site:命令拉庶,生成一個HTML文檔,來描述這個項目使用了那些jar包
- post-site:執(zhí)行一些需要在site之后馬上完成的工作秃励。
- site-deploy:將生成的站點文檔部署到特定的服務器上氏仗。
8:maven的pom.xml
maven每個項目中的pom.xml是最核心的項目配置文件,它可以確定項目的jdk版本夺鲜,項目名字皆尔,項目版本帚稠,依賴包等內(nèi)容,
eg :添加一個依賴包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
eg: 配置項目的默認jdk版本
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
9: 依賴范圍
當引入jar包時床佳,給他指定依賴的范圍滋早,就能確定他在什么程序的什么時間,地點出現(xiàn)砌们,例如在web
開發(fā)中杆麸,我們引入了servlet-api包,但我們的tomcat自己就有這個包浪感,這時就不需要我們引入這個包時在運行是這個包也存在昔头,所以指定這個引入范圍為provided,這個項目打包的時候影兽,servlet-api包就不會打包到項目包中揭斧。
依賴范圍 | 對編譯有效 | 對測試有效 | 對運行有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | N | Y | N | Junit,無法進行依賴傳遞 |
provided | Y | Y | N | servlet-api |
runtime | N | Y | Y | JDBC驅(qū)動 |
system | Y | Y | N | 本地maven倉庫之外的類庫 |
jar的引入默認的依賴范圍為compile峻堰,指定jar的依賴范圍方式為
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
<scope>provided</scope> <!--scope為指定jar的依賴范圍-->
</dependency>
10: maven概念模型
maven概念模型就是對上面所有內(nèi)容的總結讹开,包含兩大核心依賴管理和項目管理,依賴管理包含
三種倉庫信息捐名,項目管理包含項目構建build旦万,項目構建的命令,其實都是由maven的插件提供的镶蹋,從而產(chǎn)出各種項目文件成艘。
二:maven提高
1: maven依賴的傳遞性
### 1.1: 傳遞性
假設有maven項目A,項目B依賴項目A贺归,項目C依賴項目B淆两,那么我們就說項目C依賴項目A,也就是說項目依賴關系為C--->B--->A,項目C也可以使用項目A中的類拂酣,這就是依賴的傳遞性秋冰。
1.2: 傳遞依賴沖突的解決
依賴沖突:導入項目依賴jar時,maven會自動導入依賴jar所依賴的jar踱葛,這就是maven的優(yōu)勢丹莲,但有時,兩個jar會同時依賴同一個jar尸诽,這就會有兩個相同的jar被依賴,這就造成項目中的依賴沖突盯另。
-
maven對依賴沖突的自己解決
- 第一聲明優(yōu)先原則:即如果出現(xiàn)沖突,誰在pom.xml中自上而下優(yōu)先聲明的添加到依賴中性含,其他的自動廢棄。
- 路徑近著優(yōu)先:這里的路徑指的是項目直接依賴路勁或者是因為傳遞依賴而添加的依賴鸳惯,這樣算下來商蕴,直接依賴的路徑更近叠萍,所以當有依賴沖突時,我們可以把某一個傳遞依賴的jar提取歘來绪商,自己添加直接依賴苛谷,這樣maven會優(yōu)先選擇路徑近的添加依賴。
-
排除依賴
- 通過使用exclusions標簽將傳遞依賴中的jar包排除掉
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> <exclusions> <!--在這里排除傳遞依賴中的jar包--> <exclusion> <groupId>org.spring.framework</groupId> <artifactId>spring.beansd</artifactId> </exclusion> </exclusions> </dependency>
- 版本的鎖定(推薦使用):就是指定項目中依賴項的版本格郁,統(tǒng)一管理依賴的版本
需要pom.xml中添加一個節(jié)點dependencyManagerment,這里指定的jar版本為依賴的最終版本腹殿,這里可以管理導入的直接依賴,也可以管理傳遞依賴例书。<!--需要添加的節(jié)點--> <dependencyManagerment> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> </dependencies> </dependencyManaggerment>
- 通過使用exclusions標簽將傳遞依賴中的jar包排除掉
2:定義常量
可以在pom.xml中添加節(jié)點properties來定義常量锣尉,在pom.xml中使用時是${常量名字}, 因為xml文件是從上而下的决采,所以常量一般都定義在使用前面自沧。
<!--定義,添加properties節(jié)點-->
<properties>
<version>1.8</version>
<user.name>tian</name>
<age>23</age>
</properties>
<!--使用-->
<dependency>
<groupId>${user.name}</groupId>
<version>${version}</version>
</dependency>
3:聚合
多個maven模塊聚集在一起树瞭,一起操作就叫做聚合
- 在父模塊中引用子模塊
<!--使用modules標簽引入子模塊--> <modules> <module>../childPath</module> <!--指定子模塊的相對路徑--> </modules>