maven基礎

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)頁資源目錄
    • ---- test 做單元測試的源代碼
      • ---- Java 測試Java源代碼目錄
      • ---- resource 測試的資源目錄, 一般不使用愚铡。
    • ---- pom.xml maven項目的核心配置文件
      注:在沒有配置的情況下蛉签,一般目錄下都會有一個target目錄,這個目錄是項目編譯后生成的目錄沥寥,用于保存編譯生成的文件碍舍,我們不需要考慮,他不是maven標準目錄結構营曼,

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)出各種項目文件成艘。


2019-01-16 14-21-25屏幕截圖.png

二: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>
      

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模塊聚集在一起树瞭,一起操作就叫做聚合

  1. 在父模塊中引用子模塊
    <!--使用modules標簽引入子模塊-->
    <modules>
     <module>../childPath</module> <!--指定子模塊的相對路徑-->
    </modules>
    
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拇厢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晒喷,更是在濱河造成了極大的恐慌旺嬉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厨埋,死亡現(xiàn)場離奇詭異邪媳,居然都是意外死亡,警方通過查閱死者的電腦和手機荡陷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門雨效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人废赞,你說我怎么就攤上這事徽龟。” “怎么了唉地?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵据悔,是天一觀的道長。 經(jīng)常有香客問我耘沼,道長极颓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任群嗤,我火速辦了婚禮菠隆,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己骇径,他們只是感情好躯肌,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著破衔,像睡著了一般清女。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰筛,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天嫡丙,我揣著相機與錄音,去河邊找鬼传惠。 笑死迄沫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卦方。 我是一名探鬼主播羊瘩,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盼砍!你這毒婦竟也來了尘吗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤浇坐,失蹤者是張志新(化名)和其女友劉穎睬捶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近刘,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡擒贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了觉渴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片介劫。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖案淋,靈堂內(nèi)的尸體忽然破棺而出座韵,到底是詐尸還是另有隱情,我是刑警寧澤踢京,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布誉碴,位于F島的核電站,受9級特大地震影響瓣距,放射性物質(zhì)發(fā)生泄漏黔帕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一旨涝、第九天 我趴在偏房一處隱蔽的房頂上張望蹬屹。 院中可真熱鬧侣背,春花似錦白华、人聲如沸慨默。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厦取。三九已至,卻和暖如春管搪,著一層夾襖步出監(jiān)牢的瞬間虾攻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工更鲁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霎箍,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓澡为,卻偏偏與公主長得像漂坏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媒至,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • |-1-更新內(nèi)容[6.從倉庫解析依賴的機制(重要)] 1Maven倉庫作用 倉庫用來存儲所有項目使用到構件顶别,在ma...
    zlcook閱讀 6,052評論 0 25
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    seyvoue閱讀 12,601評論 1 36
  • Maven的基本了解 什么是Maven? Maven就是Apache下的一個開源項目拒啰。它是用純java開發(fā)的驯绎。是一...
    Bcome閱讀 2,818評論 0 7
  • 2018年11月21日,小雨 這幾天家里才供暖谋旦,溫度不是很高剩失,婆婆就帶著兒子去了我大姑姐家,家里清凈了許多册着,晚...
    海碩果燕閱讀 164評論 0 0
  • 北歐控也要剁手有道拴孤。 我們分赴了北京和上海的 3 家 HAY 專賣店,不僅輪流試坐了 HAY 的名椅指蚜、沙發(fā)乞巧,也隨機...
    唯物生活研究所閱讀 2,010評論 0 1