1. 程式人生 > 其它 >maven(一) maven到底是個啥玩意~

maven(一) maven到底是個啥玩意~

maven(一) maven到底是個啥玩意~
https://www.cnblogs.com/whgk/p/7112560.html

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

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

                              --WZY

 

一、簡單的小問題?

    解釋之前,提1個小問題。

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

        很簡單,這不就是跟我們之前寫程式時一樣嗎,需要用哪個專案中的哪些類,也就是用別人寫好了的功能程式碼,匯入jar包即可。所以這裡也如此,可以將B專案打成jar包,然後在A專案的Library下匯入B的jar檔案,這樣,A專案就可以呼叫B專案中的某些類了。

        這樣做幾種缺陷

          如果在開發過程中,發現B中的bug,則必須將B專案修改好,並重新將B打包並對A專案進行重編譯操作

          在完成A專案的開發後,為了保證A的正常執行,就需要依賴B(就像在使用某個jar包時必須依賴另外一個jar一樣),兩種解決方案,第一種,選擇將B打包入A中,第二種,將B也釋出出去,等別人需要用A時,告訴開發者,想要用A就必須在匯入Bjar包。兩個都很麻煩,前者可能造成資源的浪費(比如,開發者可能正在開發依賴B的其它專案,B已經儲存到本地了,在匯入A的jar包的話,就有了兩個B的jar),後者是我們常遇到的,找各種jar包,非常麻煩(有了maven就不一樣了)

 

      1.2、我們開發一個專案,或者做一個小demo,比如用SSH框架,那麼我們就必須將SSH框架所用的幾十個依賴的jar包依次找出來並手動匯入,超級繁瑣。 

    

    上面兩個問題的描述,其實都屬於專案與專案之間依賴的問題[A專案使用SSH的所有jar,就說A專案依賴SSH],人為手動的去解決,很繁瑣,也不方便,所以使用maven來幫我們管理

 

二、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專案時都會要求寫上這三個屬性值的。

          

        

         

 

三、maven的安裝

    這一步maven環境的配置,我覺得有必要安裝一下,目的為了使用命令列建立maven專案,和使用命令列操作maven專案。這裡不細講,給出連結,跟安裝jdk環境類似,maven的安裝教程和配置

 還有注意,我以下用的是maven3.0.4版本(比較低的),你們可以下載最新的版本,最好是使用jdk1.7.

四、倉庫的概念

    通過pom.xml中的配置,就能夠獲取到想要的jar包(還沒講解如何配置先需要了解一下倉庫的概念),但是這些jar是在哪裡呢?就是我們從哪裡獲取到的這些jar包?答案就是倉庫。

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

      4.1、本地倉庫

          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.2、第三方倉庫

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

          私服:一般是由公司自己設立的,只為本公司內部共享使用。它既可以作為公司內部構件協作和存檔,也可作為公用類庫映象快取,減少在外部訪問和下載的頻率。(使用私服為了減少對中央倉庫的訪問

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

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

          注意:連線私服,需要單獨配置。如果沒有配置私服,預設不使用

 

      4.3、中央倉庫

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

          這個公共倉庫是由Maven自己維護,裡面有大量的常用類庫,幷包含了世界上大部分流行的開源專案構件。目前是以java為主

          工程依賴的jar包如果本地倉庫沒有,預設從中央倉庫下載

 

      總結:獲取jar包的過程

              

 

五、使用命令列管理maven專案

      5.1、建立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.2、maven java專案結構

          simple
            ---pom.xml    核心配置,專案根下
            ---src
             ---main      
                  ---java    java原始碼目錄
                    ---resources   java配置檔案目錄
             ---test
               ---java    測試原始碼目錄
               ---resources   測試配置目錄

          

          圖中有一個target目錄,是因為將該java專案進行了編譯,src/main/java下的原始碼就會編譯成.class檔案放入target目錄中,target就是輸出目錄。

      5.3、建立 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.4、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.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.6、例子:使用命令操作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.8、其他命令

          maven java或web專案轉換Eclipse工程

             mvn eclipse:eclipse

             mvn eclipse:clean  清楚eclipse設定資訊,又從eclipse工程轉換為maven原生專案了    

          ...轉換IDEA工程

             mvn idea:idea

             mvn idea:clean  同上 

 

六、使用Myeclipse建立maven自定義專案

    使用myeclpse建立專案前,需要在myeclipse中配置maven的一些資訊

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

      6.1、java專案

          1、選擇maven project,如果右鍵新建沒有,通過other獲得

              

          2、建立一個簡單專案(跳過骨架選擇)

              

          3、設定專案引數,建立java專案

                             

              

          4、建立java專案結果

              

          

      6.2、建立maven web專案

          1、同上

          2、同上

          3、設定專案引數,其他一樣,選擇打包方式不一樣。

                

          4、建立web專案結果

                

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

                

             結果如下

                     

             然後需要更新一下專案,就不報錯了。

                

 

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

                     

            錯誤資訊為缺少serlvet-jar和jsp-jar包

                    

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

                      

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

                  

              找到servle-jar包

                  

              pom.xml中檢查,修改

                  

              修改完後,發現兩個jar包都載入進來了,專案完好,不在報錯了。

                    

 

      6.3、建立maven專案

          都一樣,在專案引數那裡修改即可

                  

          結果

                  

          maven專案一般沒用,在開發中將一個專案拆分成多個項,就需要使用maven專案(pom專案)將其他子專案進行整合,下一章節講解,很重要。很重要。

 

      6.4、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.5、例子,將maven web專案釋出到tomcat執行

          命令:tomcat:run

                  

          通過網址即可訪問,同時會將該專案上傳到本地倉庫。

 

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

    之前一直在使用pom.xml中找jar包最關鍵的三個屬性,groupId、artifactId、version,應該有些印象了,也知道為什麼通過這三個能找到對應的jar包,但是沒有細講其中的一些小的知識點,比如上面新增servlet-jar和jsp-jar的依賴時,出現的一些屬性就不太懂,所以,這一章節,就將依賴關係全面分析。

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

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

        步驟一:百度搜索關鍵字“maven repository”

              

        步驟二:輸入關鍵字查詢獲得需要內容,確定需要版本

              

        

        步驟三、獲得座標

              

 

       方式2、使用本地倉庫,通過myeclipse獲得座標

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

         步驟一:新增依賴,pom.xml檔案中,右鍵  

                

         步驟二:獲得座標

               

  

      7.2、依賴(座標)的常見配置

         為了避免不知道說的哪些配置屬性,看下面圖就明白了,就是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,以便我們不會報錯,所以,這兩個很特殊。看圖

               1、開發階段(MyEclipse提供),看下圖以此證明我們說的

                  java web 5.0專案:                    java web 6.0專案:

               2、執行階段(tomcat提供)   

                      

               所以,根據這個特點,如果使用maven開發專案,就不是web專案了,那麼myeclipse就不會在給我們提供這兩個jar包,我們就必須自己手動通過座標從倉庫中獲取,但是針對上面的分析,當執行的時候,tomcat會幫我們提供這兩個jar包,所以我們自己從倉庫中獲取的jar包就不能和tomcat中的衝突,那麼就正好可以通過provided這個屬性,來設定這兩個jar的作用範圍,就是在變異時期和測試時期生效即可。

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

    

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

 

      7.3、依賴調節原則

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

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

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

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

               使用X(2.0),因為其路徑更近 

            2、第二原則:第一宣告者優先原則。就是如果路徑相同,maven 預設配置在前面的優先使用

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

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

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

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

            

八、總結

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

      如何搭建私服?

      如何從私服中獲取jar包

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

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

 

 

 

  

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

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

                              --WZY

 

一、簡單的小問題?

    解釋之前,提1個小問題。

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

        很簡單,這不就是跟我們之前寫程式時一樣嗎,需要用哪個專案中的哪些類,也就是用別人寫好了的功能程式碼,匯入jar包即可。所以這裡也如此,可以將B專案打成jar包,然後在A專案的Library下匯入B的jar檔案,這樣,A專案就可以呼叫B專案中的某些類了。

        這樣做幾種缺陷

          如果在開發過程中,發現B中的bug,則必須將B專案修改好,並重新將B打包並對A專案進行重編譯操作

          在完成A專案的開發後,為了保證A的正常執行,就需要依賴B(就像在使用某個jar包時必須依賴另外一個jar一樣),兩種解決方案,第一種,選擇將B打包入A中,第二種,將B也釋出出去,等別人需要用A時,告訴開發者,想要用A就必須在匯入Bjar包。兩個都很麻煩,前者可能造成資源的浪費(比如,開發者可能正在開發依賴B的其它專案,B已經儲存到本地了,在匯入A的jar包的話,就有了兩個B的jar),後者是我們常遇到的,找各種jar包,非常麻煩(有了maven就不一樣了)

 

      1.2、我們開發一個專案,或者做一個小demo,比如用SSH框架,那麼我們就必須將SSH框架所用的幾十個依賴的jar包依次找出來並手動匯入,超級繁瑣。 

    

    上面兩個問題的描述,其實都屬於專案與專案之間依賴的問題[A專案使用SSH的所有jar,就說A專案依賴SSH],人為手動的去解決,很繁瑣,也不方便,所以使用maven來幫我們管理

 

二、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專案時都會要求寫上這三個屬性值的。

          

        

         

 

三、maven的安裝

    這一步maven環境的配置,我覺得有必要安裝一下,目的為了使用命令列建立maven專案,和使用命令列操作maven專案。這裡不細講,給出連結,跟安裝jdk環境類似,maven的安裝教程和配置

 還有注意,我以下用的是maven3.0.4版本(比較低的),你們可以下載最新的版本,最好是使用jdk1.7.

四、倉庫的概念

    通過pom.xml中的配置,就能夠獲取到想要的jar包(還沒講解如何配置先需要了解一下倉庫的概念),但是這些jar是在哪裡呢?就是我們從哪裡獲取到的這些jar包?答案就是倉庫。

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

      4.1、本地倉庫

          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.2、第三方倉庫

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

          私服:一般是由公司自己設立的,只為本公司內部共享使用。它既可以作為公司內部構件協作和存檔,也可作為公用類庫映象快取,減少在外部訪問和下載的頻率。(使用私服為了減少對中央倉庫的訪問

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

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

          注意:連線私服,需要單獨配置。如果沒有配置私服,預設不使用

 

      4.3、中央倉庫

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

          這個公共倉庫是由Maven自己維護,裡面有大量的常用類庫,幷包含了世界上大部分流行的開源專案構件。目前是以java為主

          工程依賴的jar包如果本地倉庫沒有,預設從中央倉庫下載

 

      總結:獲取jar包的過程

              

 

五、使用命令列管理maven專案

      5.1、建立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.2、maven java專案結構

          simple
            ---pom.xml    核心配置,專案根下
            ---src
             ---main      
                  ---java    java原始碼目錄
                    ---resources   java配置檔案目錄
             ---test
               ---java    測試原始碼目錄
               ---resources   測試配置目錄

          

          圖中有一個target目錄,是因為將該java專案進行了編譯,src/main/java下的原始碼就會編譯成.class檔案放入target目錄中,target就是輸出目錄。

      5.3、建立 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.4、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.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.6、例子:使用命令操作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.8、其他命令

          maven java或web專案轉換Eclipse工程

             mvn eclipse:eclipse

             mvn eclipse:clean  清楚eclipse設定資訊,又從eclipse工程轉換為maven原生專案了    

          ...轉換IDEA工程

             mvn idea:idea

             mvn idea:clean  同上 

 

六、使用Myeclipse建立maven自定義專案

    使用myeclpse建立專案前,需要在myeclipse中配置maven的一些資訊

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

      6.1、java專案

          1、選擇maven project,如果右鍵新建沒有,通過other獲得

              

          2、建立一個簡單專案(跳過骨架選擇)

              

          3、設定專案引數,建立java專案

                             

              

          4、建立java專案結果

              

          

      6.2、建立maven web專案

          1、同上

          2、同上

          3、設定專案引數,其他一樣,選擇打包方式不一樣。

                

          4、建立web專案結果

                

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

                

             結果如下

                     

             然後需要更新一下專案,就不報錯了。

                

 

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

                     

            錯誤資訊為缺少serlvet-jar和jsp-jar包

                    

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

                      

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

                  

              找到servle-jar包

                  

              pom.xml中檢查,修改

                  

              修改完後,發現兩個jar包都載入進來了,專案完好,不在報錯了。

                    

 

      6.3、建立maven專案

          都一樣,在專案引數那裡修改即可

                  

          結果

                  

          maven專案一般沒用,在開發中將一個專案拆分成多個項,就需要使用maven專案(pom專案)將其他子專案進行整合,下一章節講解,很重要。很重要。

 

      6.4、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.5、例子,將maven web專案釋出到tomcat執行

          命令:tomcat:run

                  

          通過網址即可訪問,同時會將該專案上傳到本地倉庫。

 

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

    之前一直在使用pom.xml中找jar包最關鍵的三個屬性,groupId、artifactId、version,應該有些印象了,也知道為什麼通過這三個能找到對應的jar包,但是沒有細講其中的一些小的知識點,比如上面新增servlet-jar和jsp-jar的依賴時,出現的一些屬性就不太懂,所以,這一章節,就將依賴關係全面分析。

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

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

        步驟一:百度搜索關鍵字“maven repository”

              

        步驟二:輸入關鍵字查詢獲得需要內容,確定需要版本

              

        

        步驟三、獲得座標

              

 

       方式2、使用本地倉庫,通過myeclipse獲得座標

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

         步驟一:新增依賴,pom.xml檔案中,右鍵  

                

         步驟二:獲得座標

               

  

      7.2、依賴(座標)的常見配置

         為了避免不知道說的哪些配置屬性,看下面圖就明白了,就是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,以便我們不會報錯,所以,這兩個很特殊。看圖

               1、開發階段(MyEclipse提供),看下圖以此證明我們說的

                  java web 5.0專案:                    java web 6.0專案:

               2、執行階段(tomcat提供)   

                      

               所以,根據這個特點,如果使用maven開發專案,就不是web專案了,那麼myeclipse就不會在給我們提供這兩個jar包,我們就必須自己手動通過座標從倉庫中獲取,但是針對上面的分析,當執行的時候,tomcat會幫我們提供這兩個jar包,所以我們自己從倉庫中獲取的jar包就不能和tomcat中的衝突,那麼就正好可以通過provided這個屬性,來設定這兩個jar的作用範圍,就是在變異時期和測試時期生效即可。

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

    

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

 

      7.3、依賴調節原則

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

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

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

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

               使用X(2.0),因為其路徑更近 

            2、第二原則:第一宣告者優先原則。就是如果路徑相同,maven 預設配置在前面的優先使用

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

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

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

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

            

八、總結

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

      如何搭建私服?

      如何從私服中獲取jar包

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

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