maven(一) maven究竟是個啥玩意~

      該篇文章篇幅很長,大概的思路以下html

          maven的介紹,初步認識,獲取jar包的三個關鍵屬性 --> 介紹倉庫(獲取的jar包從何而來)-->用命令行管理maven項目(建立maven項目) --> 用myeclipse建立maven項目 -->詳細介紹pom.xml中的依賴關係(座標獲取、定位jar包的各類屬性講解。java

                              --WZYweb

 

1、簡單的小問題?spring

    解釋以前,提1個小問題。編程

      1.一、假如你正在Eclipse下開發兩個Java項目,姑且把它們稱爲A、B,其中A項目中的一些功能依賴於B項目中的某些類,那麼如何維繫這種依賴關係的呢?api

        很簡單,這不就是跟咱們以前寫程序時同樣嗎,須要用哪一個項目中的哪些類,也就是用別人寫好了的功能代碼,導入jar包便可。因此這裏也如此,能夠將B項目打成jar包,而後在A項目的Library下導入B的jar文件,這樣,A項目就能夠調用B項目中的某些類了。緩存

        這樣作幾種缺陷tomcat

          若是在開發過程當中,發現B中的bug,則必須將B項目修改好,並從新將B打包並對A項目進行重編譯操做app

          在完成A項目的開發後,爲了保證A的正常運行,就須要依賴B(就像在使用某個jar包時必須依賴另一個jar同樣),兩種解決方案,第一種,選擇將B打包入A中,第二種,將B也發佈出去,等別人須要用A時,告訴開發者,想要用A就必須在導入Bjar包。兩個都很麻煩,前者可能形成資源的浪費(好比,開發者可能正在開發依賴B的其它項目,B已經存儲到本地了,在導入A的jar包的話,就有了兩個B的jar),後者是咱們常遇到的,找各類jar包,很是麻煩(有了maven就不同了)框架

 

      1.二、咱們開發一個項目,或者作一個小demo,好比用SSH框架,那麼咱們就必須將SSH框架所用的幾十個依賴的jar包依次找出來並手動導入,超級繁瑣。 

    

    上面兩個問題的描述,其實都屬於項目與項目之間依賴的問題[A項目使用SSH的全部jar,就說A項目依賴SSH],人爲手動的去解決,很繁瑣,也不方便,因此使用maven來幫咱們管理

 

2、maven究竟是什麼?

    Maven是基於項目對象模型(POM project object model),能夠經過一小段描述信息(配置)來管理項目的構建,報告和文檔的軟件項目管理工具[百度百科]

    這種又是大白話,若是沒明白maven是什麼,那麼上面這句話跟沒說同樣,我本身以爲,Maven的核心功能即是合理敘述項目間的依賴關係,通俗點講,就是經過pom.xml文件的配置獲取jar包,而不用手動去添加jar包,而這裏pom.xml文件對於學了一點maven的人來講,就有些熟悉了,怎麼經過pom.xml的配置就能夠獲取到jar包呢?pom.xml配置文件從何而來?等等相似問題咱們須要搞清楚,若是須要使用pom.xml來獲取jar包,那麼首先該項目就必須爲maven項目,maven項目能夠這樣去想,就是在java項目和web項目的上面包裹了一層maven,本質上java項目仍是java項目,web項目仍是web項目,可是包裹了maven以後,就可使用maven提供的一些功能了(經過pom.xml添加jar包)。

    因此,根據上一段的描述,咱們最終的目的就是學會如何在pom.xml中配置獲取到咱們想要的jar包,在此以前咱們就必須瞭解如何建立maven項目,maven項目的結構是怎樣,與普通java,web項目的區別在哪裏,還有如何配置pom.xml獲取到對應的jar包等等,這裏提早了解一下咱們如何經過pom.xml文件獲取到想要的jar的,具體後面會詳細講解該配置文件。

    pom.xml獲取junit的jar包的編寫。

          

    爲何經過groupId、artifactId、version三個屬性就能定位一個jar包?

        加入上面的pom.xml文件屬於A項目,那麼A項目確定是一個maven項目,經過上面這三個屬性可以找到junit對應版本的jar包,那麼junit項目確定也是一個maven項目,junit的maven項目中的pom.xml文件就會有三個標識符,好比像下圖這樣,而後別的maven項目就能經過這三個屬性來找到junit項目的jar包了。因此,在每一個建立的maven項目時都會要求寫上這三個屬性值的。

          

        

         

 

3、maven的安裝

    這一步maven環境的配置,我以爲有必要安裝一下,目的爲了使用命令行建立maven項目,和使用命令行操做maven項目。這裏不細講,給出連接,跟安裝jdk環境相似,maven的安裝教程和配置

 還有注意,我如下用的是maven3.0.4版本(比較低的),大家能夠下載最新的版本,最好是使用jdk1.7.

4、倉庫的概念

    經過pom.xml中的配置,就可以獲取到想要的jar包(還沒講解如何配置先須要瞭解一下倉庫的概念),可是這些jar是在哪裏呢?就是咱們從哪裏獲取到的這些jar包?答案就是倉庫。

    倉庫分爲:本地倉庫、第三方倉庫(私服)、中央倉庫

      4.一、本地倉庫

          Maven會將工程中依賴的構件(Jar包)從遠程下載到本機一個目錄下管理,每一個電腦默認的倉庫是在 $user.home/.m2/repository下

                  

              例如個人就在:C:\Users\Administrator\.m2\repository

          通常咱們會修改本地倉庫位置,本身建立一個文件夾,在從網上下載一個擁有相對完整的全部jar包的結合,都丟到本地倉庫中,而後每次寫項目,直接從本地倉庫裏拿就好了

                這裏面有不少各類各樣咱們須要的jar包。

          修改本地庫位置:在$MAVEN_HOME/conf/setting.xml文件中修改,

                

                

          D:\java\maven\repository:就是咱們本身建立的本地倉庫,將網上下載的全部jar包,都丟到該目錄下,咱們就能夠直接經過maven的pom.xml文件直接拿。

 

      4.二、第三方倉庫

          第三方倉庫,又稱爲內部中心倉庫,也稱爲私服

          私服:通常是由公司本身設立的,只爲本公司內部共享使用。它既能夠做爲公司內部構件協做和存檔,也可做爲公用類庫鏡像緩存,減小在外部訪問和下載的頻率。(使用私服爲了減小對中央倉庫的訪問

          私服可使用的是局域網,中央倉庫必須使用外網

          也就是通常公司都會建立這種第三方倉庫,保證項目開發時,項目所需用的jar都從該倉庫中拿,每一個人的版本就都同樣。

          注意:鏈接私服,須要單獨配置。若是沒有配置私服,默認不使用

 

      4.三、中央倉庫

          Maven內置了遠程公用倉庫:http://repo1.maven.org/maven2

          這個公共倉庫是由Maven本身維護,裏面有大量的經常使用類庫,幷包含了世界上大部分流行的開源項目構件。目前是以java爲主

          工程依賴的jar包若是本地倉庫沒有,默認從中央倉庫下載

 

      總結:獲取jar包的過程

              

 

5、使用命令行管理maven項目

      5.一、建立maven java項目

          本身建立一個文件夾,在該文件夾下按shift+右擊,點開使用命令行模式,這樣建立的maven[java]項目就在該文件夾下了。

          命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart

            mvn:核心命令

            archetype:create建立項目,如今maven高一點的版本都棄用了create命令而使用generate命令了。

            -DgroupId=com.wuhao.maven.quickstart :建立該maven項目時的groupId是什麼,該做用在上面已經解釋了。通常使用包名的寫法。由於包名是用公司的域名的反寫,獨一無二

            -DartifactId=simple:建立該maven項目時的artifactId是什麼,就是項目名稱

            -DarchetypeArtifactId=maven-archetype-quickstart:表示建立的是[maven]java項目

           運行的前提:須要聯網,必須上網下載一個小文件

                

          運行成功後

                  

          在D:\java\maven\demo下就會生成一個simple的文件,該文件就是咱們的maven java項目

                

      5.二、maven java項目結構

          simple
            ---pom.xml    核心配置,項目根下
            ---src
             ---main      
                  ---java    java源碼目錄
                    ---resources   java配置文件目錄
             ---test
               ---java    測試源碼目錄
               ---resources   測試配置目錄

          

          圖中有一個target目錄,是由於將該java項目進行了編譯,src/main/java下的源代碼就會編譯成.class文件放入target目錄中,target就是輸出目錄。

      5.三、建立 maven web 項目

          命令:mvn archetype:create -DgroupId=com.wuhao.maven.quickstart -DartifactId=myWebApp -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot

          其餘都差很少,建立maven web項目的話 -DarchetypeArtifactId=maven-archetype-webapp 比建立java項目多了一個 -Dversion=0.01-snapshot, 在建立java項目的時候也能夠加上這個,若是不寫,會默認幫咱們加上1.0-snapshot。

              

           在D:\java\maven\demo下就會生成一個myWebApp的文件 

                  

      5.四、maven web項目結構

          pom.xml                 核心配置
          src/main/java                java源碼
          src/main/resources            java配置
          src/main/webapp            myeclipse web項目中 WebRoot目錄
                |-- WEB-INF
                   |-- web.xml
          src/test                    測試
          target                    輸出目錄

 

      5.五、命令操做maven java或web項目 

          編譯:mvn compile  --src/main/java目錄java源碼編譯生成class (target目錄下)

          測試:mvn test    --src/test/java 目錄編譯

          清理:mvn clean    --刪除target目錄,也就是將class文件等刪除

          打包:mvn package  --生成壓縮文件:java項目#jar包;web項目#war包,也是放在target目錄下

          安裝:mvn install   --將壓縮文件(jar或者war)上傳到本地倉庫

          部署|發佈:mvn deploy  --將壓縮文件上傳私服

      5.六、例子:使用命令操做maven java項目

          注意:使用命令時,必須在maven java項目的根目錄下,及能夠看到pom.xml

          描述:將maven java項目打包上傳到本地倉庫供別人調用

            使用 mvn install

                

            在本地倉庫中查看是否有該項目

                D:\java\maven\repository\com\wuhao\maven\quickstart\simple\1.0-SNAPSHOT

                

            經過在本地倉庫中的目錄能夠發現爲何經過groupId、artifactId、version能夠定位到倉庫中得jar包,也能夠知道爲何groupId要使用公司域名的反寫(由於這樣惟一,不會與別的項目重名致使查找到的內容不精確)

 

      5.7、maven項目的完整生命週期,當執行生命週期後面命令時,前面步驟的命令自動執行

                

          紅色標記字體的意思就是當咱們直接使用mvn install命令對項目進行上傳至本地倉庫時,那麼前面全部的步驟將會自動執行,好比源代碼的編譯,打包等等。

 

      5.八、其餘命令

          maven java或web項目轉換Eclipse工程

             mvn eclipse:eclipse

             mvn eclipse:clean  清楚eclipse設置信息,又從eclipse工程轉換爲maven原生項目了    

          ...轉換IDEA工程

             mvn idea:idea

             mvn idea:clean  同上 

 

6、使用Myeclipse建立maven自定義項目

    使用myeclpse建立項目前,須要在myeclipse中配置maven的一些信息

      好比:配置本地倉庫、安裝自定義maven(myeclipse中高版本自帶了maven)等,這裏省略。

      6.一、java項目

          一、選擇maven project,若是右鍵新建沒有,經過other得到

              

          二、建立一個簡單項目(跳過骨架選擇)

              

          三、設置項目參數,建立java項目

              

              

              

          四、建立java項目結果

              

          

      6.二、建立maven web項目

          一、同上

          二、同上

          三、設置項目參數,其餘同樣,選擇打包方式不同。

                

          四、建立web項目結果

                

          五、可能報錯1:pom.xml報錯

                

             結果以下

                     

             而後須要更新一下項目,就不報錯了。

                

 

          六、報錯2,編寫jsp時報錯

                     

            錯誤信息爲缺乏serlvet-jar和jsp-jar包

                    

            解決:使用pom.xml定位導入相應的jar包

                      

              找到jsp-jar包,scope的做用是表示該jar包的做用範圍,provided表示在編譯和測試期有效,在運行期則無效。具體後面講解pom.xml時會講解到。     

                  

              找到servle-jar包

                  

              pom.xml中檢查,修改

                  

              修改完後,發現兩個jar包都加載進來了,項目無缺,不在報錯了。

                    

 

      6.三、建立maven項目

          都同樣,在項目參數那裏修改便可

                  

          結果

                  

          maven項目通常沒用,在開發中將一個項目拆分紅多個項,就須要使用maven項目(pom項目)將其餘子項目進行整合,下一章節講解,很重要。很重要。

 

      6.四、myeclipse maven操做

                  

        6--9 都是快捷方式

          9 測試,至關於命令行 mvn test

          8 安裝,至關於命令行 mvn install  做用:將其上傳到本地倉庫,具體見上面講解

          7 關聯源碼,這個不須要解釋吧,日常咱們使用別的jar包也關聯過源碼

          6 清理,mvn clean

        5 maven bulid  執行maven命令,等效 mvn

                  

        4 maven build  5快速的操做

          若是沒有操做過,與5相同

          若是操做過一次,將直接執行上一次5的命令

          若是操做屢次,將提供選擇框

 

      6.五、例子,將maven web項目發佈到tomcat運行

          命令:tomcat:run

                  

          經過網址便可訪問,同時會將該項目上傳到本地倉庫。

 

7、pom.xml的依賴關係講解(重點)

    以前一直在使用pom.xml中找jar包最關鍵的三個屬性,groupId、artifactId、version,應該有些印象了,也知道爲何經過這三個能找到對應的jar包,可是沒有細講其中的一些小的知識點,好比上面添加servlet-jar和jsp-jar的依賴時,出現的一些屬性就不太懂,因此,這一章節,就將依賴關係全面分析。

    7.一、如何獲取座標(也就是三個關鍵屬性值)

      方式1:使用網站搜索[從中央倉庫拿]

        步驟一:百度搜索關鍵字「maven repository」

              

        步驟二:輸入關鍵字查詢得到須要內容,肯定須要版本

              

        

        步驟3、得到座標

              

 

       方式二、使用本地倉庫,經過myeclipse得到座標

         上面已經介紹過了如何從本地倉庫獲取對應jar,這裏在簡單闡述一下

         步驟一:添加依賴,pom.xml文件中,右鍵  

                

         步驟二:得到座標

               

  

      7.二、依賴(座標)的常見配置

         爲了不不知道說的哪些配置屬性,看下面圖就明白了,就是dependency下的屬性配置,所有有9個,講其中的7個。

                

         groupId、artifactId、version是依賴的基本座標,缺一不可,這三個能夠不用將,都知道,重要的是除了這三個以外的配置屬性須要咱們理解

         type:依賴的類型,好比是jar包仍是war包等

            默認爲jar,表示依賴的jar包

            注意:<type>pom.lastUpdated</type> 這個咱們在上面添加servlet-jar的時候就遇到過,看到lastUpdated的意思是表示使用更新描述信息,佔位符做用,通俗點講,選擇該類型,jar包不會被加載進來,只是將該jar包的一些描述信息加載進來,使別的jar包在引用他時,可以看到一些相關的提示信息,僅此而已,因此說他是個佔位符,只要記住他的jar包不會被加載進來。

         optional:標記依賴是否可選。默認值false

            好比struts2中內置了log4j這個記錄日誌的功能,就是將log4j內嵌入struts2的jar包中,而struts2有沒有log4j這個東西都不要緊,有它,提示的信息更多,沒它,也可以運行,只是提示的信息就相對而言少一些,因此這個時候,就能夠對它進行可選操做,想要它就要,不想要,就設置爲false。

         exclusions:排除傳遞依賴,解決jar衝突問題

            依賴傳遞的意思就是,A項目 依賴 B項目,B項目 依賴 C項目,當使用A項目時,就會把B也給加載進來,這是傳遞依賴,依次類推,C也會所以給加載進來。

            這個有依賴傳遞有好處,也有壞處,壞處就是jar包的衝突問題,好比,A 依賴 B(B的版本爲1),C 依賴 B(B的版本爲2),若是一個項目同時須要A和C,那麼A,C都會傳遞依賴將B給加載進來,問題就在這裏,兩個B的版本不同,將兩個都加載進去就會引發衝突,這時候就須要使用exclusions這個屬性配置了。maven也會有一個機制避免兩個都加載進去,maven 默認配置在前面的優先使用,可是咱們仍是須要使用exclusions來配置更合理,這裏使用spring bean 和 struts2 spring plugin 來舉例子說明這個問題並使用exclusions解決這個問題。(spring bean 和 struts2 spring plugin都須要依賴spring-core,但版本不同)

            從本地倉庫中找到這兩個jar包

                  

            maven本身的解決方案以下

              maven 默認配置在前面的優先使用,下面是證實

                先將spring-beans加載進去的,因此會將spring-beans依賴的spring-core的版本加載進來。

                             

                先將struts2-spring-plugin加載進來,那麼就會將其依賴的spring-core的版本加載進來

                      

              

            使用exclusions來配置

               即便struts2-spring-plugin 配置在前面,也須要使用3.2.0版本。則須要爲struts2-spring-plugin 排除依賴(不使用3.0.5依賴)

                     

               注意:這樣,就將struts2-spring-plugin依賴的spring-core的版本排除依賴了,也就是該依賴的spring-core不會在加載進來,查看代碼,看是否符合要求,若是不符合要求,須要手動的修改 

                    

 

         scope:依賴範圍,意思就是經過pom.xml加載進來的jar包,來什麼範圍內使用生效,範圍包括編譯時,運行時,測試時

                    

            compile:默認值,若是選擇此值,表示編譯、測試和運行都使用當前jar

            test:表示只在測試時當前jar生效,在別的範圍內就不能使用該jar包。例如:junit 。此處不寫也不報錯,由於默認是compile,compile包擴了測試

            runtime,表示測試和運行時使用當前jar,編譯時不用該jar包。例如:JDBC驅動。JDBC驅動,在編譯時(也就是咱們寫代碼的時候都是採用接口編程,壓根就沒使用到JDBC驅動包內任何東西,只有在運行時才用的到,因此這個是典型的使用runtime這個值的例子),此處不寫也不報錯,理由同上

            provided,表示編譯和測試時使用當前jar,運行時不在使用該jar了。例如:servlet-api、jsp-api等。【必須填寫】

               什麼意思呢? 在咱們之前建立web工程,編寫servlet或者jsp時,就沒導入過jar包把,由於myeclipse或者別的ide幫咱們提供了這兩個jar包,內置了,因此咱們在編譯期測試期使用servlet都不會報缺乏jar包的錯誤,而在運行時期,離開了myeclipse或別的ide,就至關於缺失了這兩個jar包,但此時tomcat又會幫咱們提供這兩個jar,以便咱們不會報錯,因此,這兩個很特殊。看圖

               一、開發階段(MyEclipse提供),看下圖以此證實咱們說的

                  java web 5.0項目: 

                  java web 6.0項目:

               二、運行階段(tomcat提供)   

                      

               因此,根據這個特色,若是使用maven開發項目,就不是web項目了,那麼myeclipse就不會在給咱們提供這兩個jar包,咱們就必須本身手動經過座標從倉庫中獲取,可是針對上面的分析,當運行的時候,tomcat會幫咱們提供這兩個jar包,因此咱們本身從倉庫中獲取的jar包就不能和tomcat中的衝突,那麼就正好能夠經過provided這個屬性,來設置這兩個jar的做用範圍,就是在變異時期和測試時期生效便可。

               這個例子就能夠解釋上面建立maven web時產生的錯誤和解決方案了。

    

            system:表示咱們本身手動加入的jar包,不屬於maven倉庫(本地,第三方等),屬於別得類庫的這樣的jar包,只在編譯和測試期生效,運行時無效。通常不用                    

 

      7.三、依賴調節原則

          這個就是maven解決傳遞依賴時jar包衝突問題的方法,按照兩種原則,上面已經介紹了一種了,就是下面的第二原則

            一、第一原則:路徑近者優先原則

                    A-->B-->C-->D-->X(1.6)

                    E-->D-->X(2.0)

               使用X(2.0),由於其路徑更近 

            二、第二原則:第一聲明者優先原則。就是若是路徑相同,maven 默認配置在前面的優先使用

                    A-->B --> X(1.6)

                    C-->D--> X(2.0)

               這樣就是路徑相同,那麼若是A在前面,C在後面,則使用X(1.6)

            maven會先根據第一原則進行選擇,第一原則不成,則按第二原則處理。

            

8、總結

      這篇文章的篇幅有點長,也消耗了我挺多的時間的,由於其中遇到一些bug,一直找不出緣由,一度想放棄,但仍是堅持了下來,這也只是maven的入門,知道大概怎麼用,看別的應該就看得懂,其實項目中真正用的仍是下一節所要講解的。

      如何搭建私服?

      如何從私服中獲取jar包

      使用maven對父工程與子模塊的拆分和聚合。

      下一節就講這些東西把,加油。

相關文章
相關標籤/搜索