1. 程式人生 > >Maven學習之初識Maven

Maven學習之初識Maven

系統的學習maven

自動化構建Java程式的工具,比較強大,現在很多Java專案都是基於maven構建的,所以有必要學習。而且,太多的hadoop專案也是採用maven新增依賴的。使用maven的另外一個原因是在java專案裡面使用到的jar包越來越多,並且使用不同的框架引入的jar包
本身也可能存在衝突,以往需要開發人員對這些jar包進行人為的排查,解決衝突。其次為了專案編譯執行沒有問題,導致jar包過多的匯入,最終導致專案中的依賴的無用的jar包太多,最終打包比較大。為了解決這些痛點,開發人員使用maven來構建java專案。

Maven的基本安裝與配置

解壓縮,設定環境變數,設定PATH更改setting.xml裡面的本地倉庫的路徑(預設.m2裡面)。將這個預設的c盤本地倉庫位置到自己設定的其他路徑。

代理配置

針對公司使用防火牆,使用代理伺服器讓所有電腦不能直接連線internet。此時下載相關的依賴是無法連線到中央倉庫的,所以需要在maven的配置檔案中新增
proxy的這個代理配置項,實現從代理伺服器上下載相關的依賴到達本地。

本地倉庫

maven中儲存所有專案依賴的本地資料夾,依賴內容需要從網上下載到本地。本地java專案的依賴直接和這個本地倉庫掛鉤,本地倉庫與遠端或者中央倉庫同步。

中央倉庫

maven構建專案時,首先更據專案的pom檔案確定專案需要哪些依賴,然後先從本地庫中獲取,如果本地庫需要更新或者沒有相關的依賴再從遠端中央倉庫下載依賴到本地庫,最後成功構建專案。其實就是一層一層查詢是否有相關依賴過程,沒有查到往高階查詢,最後沒查到相關的依賴包進行錯誤列印。

新增其他遠端倉庫

中央倉庫並不是齊全的,有些依賴來自於其他倉庫,所以構建專案的時候需要新增其他倉庫,將其他遠端倉庫資訊寫在repository屬性中。提供遠端倉庫的位置

<repositories>
    <repository>
      <id>java.net</id>
      <url>https://maven.java.net/content/repositories/public/</url>
    </repository>
 </repositories>

Maven依賴機制

自動下載所需的依賴並保證依賴的版本更新。(根據pom中的依賴資訊以及版本)。
pom中需要使用一個dependency的xml片段指明依賴庫的maven座標,即是groupId,artifactId 和version。如果沒有version欄位,那麼maven會下載最新的版本放在本地倉庫。當用maven構建或者編譯這個專案時,根據這個xml片段maven會下載或者更新log4j

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

往本地maven倉庫新增內容

有時候自己bulid的一些工具類可以封裝成jar包(這些jar包一般不在中央倉庫裡面)在不同的專案中使用,規範起見可以將這些jar包放在maven本地倉庫裡面,讓其他的專案能夠使用這個依賴包。
首先建立一個jar包。
Testtool-1.0.jar 位置在F盤根目錄
使用指令mvn install 將指定的jar包新增到本地倉庫中。需要注意的是在新增過程中需要指定maven座標,即是groupId,artifactId以及version,並且在pom檔案中需要正確的宣告,這樣構建這個專案的時候這個jar包才能夠被檢索。
整個install指令如下:

mvn install:install file -Dfile=F:\Testtool-1.0.jar -DgroupId=aa.bb.cc -DartifactId=Testtool -Dversion=1.0 -Dpackaging=jar

此時可以在maven的本地倉庫中看到這個jar包了
最後在其他專案pom.xml新增宣告構建該專案即可

<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

使用模板構建一個java專案

mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

指定目錄下執行上面的程式碼,可以利用模板建立一個簡單的java專案。groupid填寫包名 artifactid 為專案名稱。
第一次構建因為需要將依賴下載到本地,所以比較慢。
這樣一個簡單的java專案通過maven構建出來了。/src/main/java/存放原始檔 /src/test/java 存放的是測試檔案
而且專案根目錄中有一個pom.xml的檔案,那是使用如上的maven指令生成的用於管理整個專案的配置檔案。代表專案一切資訊。如果需要新增其他的依賴那麼在這個pom檔案裡面宣告即可。
如果要轉換為eclispe專案。那麼在專案根目錄下執行mvn eclipse:eclipse即可完全轉換為eclipse專案。
如果要去eclipse使用mvn eclipse:clean

這個時候整個專案還是比較原始的,所有的依賴資訊包含在pom.xml。更新或者新增依賴包,操作這個pom.xml檔案,比如要更新junit版本
生成的junit為3.8.1版本比較低,現在改為4.11

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

同時制定java編譯的jdk為1.8版本

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>

完整的更新的pom.xml檔案如下

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.alex</groupId>
  <artifactId>number</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>number</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
</project>

然後再pom所在資料夾下執行mvn install即可完成依賴的更新

Maven座標的概念

maven座標指的是pom.xml中的程式碼片段,指定maven構建專案依賴或者外掛的位置。格式正確才能夠正常下載更新依賴或者外掛。座標一般包含groupId
groupdId 其實就是包名。約定下載的內容儲存在本地庫中的位置。artifactId 其實就是外掛的名稱在groupdId定義的資料夾下面。

maven專案與eclipse專案互相轉換

mvn eclipse:eclipse轉換成eclipse專案 mvn eclipse:clean還原成maven專案

編寫測試檔案以及編寫Main函式檔案

使用測試驅動開發的方式,首先構建主函式類,然後構建測試類。

專案打包mvn package

因為在pom.xml檔案中已經定義了專案的輸出為jar包

<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>

所以使用mvn package即可完成打包。如果專案沒有編譯生成.class檔案,使用mvn package也可以完成編譯然後打包生成jar

總結常用的maven指令

mvn compile:只編譯原始碼
mvn test-compile:只是編譯測試程式碼
mvn test:執行測試
mvn site:生成site
mvn package:生成打包檔案
mvn install: 安裝或者更新jar到本地倉庫
mvn clean:清除專案(輸出target檔案以及其中的內容)
mvn eclipse:eclipse 生成eclipse專案 mvn eclipse:clean 還原成標準maven專案
mvn idea:idea 同上生成idea專案 mvn idea:clean 還原成標準maven專案
mvn package 進行打包
mvn help:help 檢視幫助資訊
mvn -Dmaven.test.skip=true XXX 跳過測試執行XXX任務。比如在mvn package時預設是要對原始碼,測試程式碼都進行編譯並且執行測試後才進行打包。這裡可以跳過測試打包,如果測試程式碼本身就沒編譯,那麼生成的target裡面也不會有測試程式碼編譯的類

maven 構建web專案

上面直到構建一般的java專案的時候使用了maven-archetype-quickstart模板,構建web專案的時候使用maven-archetype-webapp這個模板完成建立
mvn archetype:generate -DgroupId={project-package} -DartifactId={projectname} -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

使用maven構建的這樣一個web專案還是過於簡單的,需要轉換為eclipse專案。
mvn eclipse:eclipse -Dwtpversion=2.0
如果沒有後面一個引數,那麼將會轉換成普通的Java 專案,而使用了後面的引數那麼將會把它轉換為一個Java web專案。

maven專案指定外部的依賴

在某一些應用場景,需要一些外部的依賴jar包(不在各種遠端倉庫中)。可以使用之前的將該依賴庫Install到本地倉庫中,但是也可以將該依賴作為外部依賴新增到pom檔案裡面,完成專案的build。比如在原來專案的src目錄下定義一個lib資料夾
資料夾下面存放的是外部依賴的jar包(Out.jar),現在要把jar包運用到專案中,那麼pom檔案應該這樣寫這個依賴的dependency

<dependency>
  <groupId>Out</groupId>
  <artifactId>Out</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/src/lib/Out.jar</systemPath>
</dependency>

這樣這個外部的依賴包可以在程式裡面正常的訪問。

mvn site 建立應用程式的專案文件

使用mvn site指令完成應用程式專案的文件建立,此時在target資料夾下會出現一個site資料夾,包含專案的詳細的描述。

maven 快照 snapshot

maven 中的庫有兩種型別,一種是snapshort快照庫和另外一種正式釋出版本的release庫。關於maven 中的快照snapshot 一般用於如下的場景。開發過程中會遇到依賴一些並不穩定的庫,這些庫會不定期的被更新。當我們自己開發專案所需的庫更新了那麼我們會在自己的本地使用 mvn install 對依賴進行更新,但是maven對於庫版本的控制是由版本號決定的,對於穩定版本即是在服務端中對當前穩定版本進行了更新(版本號不變)本地maven不會自動的下載依賴庫到本地倉庫。此時就需要使用snapshort了。
在pom.xml依賴的庫的version標籤中加入version-SNAPSHORT(大寫)表示依賴的庫為快照版,此時同一個版本的快照只要在遠端倉庫裡面有更新,在本地使用更新的時候就會下載最新的依賴倉庫。這樣可以一直保持本地庫與遠端庫的快照一致。如下的一個例子,假設開發團隊依賴於資料團隊提供的一個庫檔案,而資料團隊提供的這個庫檔案提交頻繁,比如每天都要進行bug的修復並且提交程式碼到遠端倉庫,此時可以按照如下的方式構建pom.xml檔案
UI團隊構建如下:

<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>
   <groupId>app-ui</groupId>
   <artifactId>app-ui</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   <name>health</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   <dependencies>
      <dependency>
      <groupId>data-service</groupId>
         <artifactId>data-service</artifactId>
         <version>1.0-SNAPSHOT</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
</project>

資料團隊構建專案的pom.xml檔案如下:

<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>
   <groupId>data-service</groupId>
   <artifactId>data-service</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>health</name>
   <url>http://maven.apache.org</url>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   </project>

只要UI團隊使用這個1.0快照作為依賴,資料團隊將這個1.0快照任何修改釋出到遠端倉庫,UI團隊本地的更新都可以獲取到最新的快照庫。但是如果沒有-SNAPSHORT這個標籤,無論資料團隊做了什麼更改,UI團隊的本地依賴庫不會更新。

Intelij Idea中使用maven小結

本段詳解在開發過程中使用Intelij Idea 使用maven。關於在Idea 中配置maven路徑以及新增maven依賴路徑將不再贅述。關於Idea中使用maven專案有兩種做法。第一可以採用mvn idea:idea將標準的maven專案轉換為idea可以識別的專案,然後將idea僅僅作為程式碼編譯器使用,其他的測試,執行和打包使用命令列下的mvn相關指令完成。
還有一種使用方式就是不進行idea專案結構轉換,在idea裡面直接進行mvn專案的開發。這是最支援的一種方式。因為idea中已經對maven有整合,並且提供了更多的功能幫助進行純maven專案的開發。
使用idea構建maven專案在new 專案的時候可以選擇maven本身具有的模板進行構建。下一步會輸入groupId 以及ArtifactId。 這兩個值會被寫入到pom.xml檔案裡面作為庫的座標。而且ArtifactId預設作為整個project的名字(在idea裡面project 相當於eclipse的workspace而module相當於eclipse裡面的project).
當建立好了第一個module後,需要向其中加入專案依賴,Idea裡面新增專案依賴有如下的標準方式:
在module的pom.xml檔案裡面右鍵選擇generate 就可以看到有dependency的選項,裡面是本地maven倉庫中具有的檔案,選擇需要的內容,add後再reimport 即可真正在專案裡面成功新增依賴。
當需要一些額外的中央倉庫的jar包,還是需要開發者先去重要倉庫查詢需要庫檔案的maven座標,手動新增到pom.xml檔案裡面,然後使用maven download source 可以下載到本地庫中。
查詢需要的依賴的maven座標的網站是:http://mvnrepository.com/ 查詢相關座標,貼入pom.xml 直接reimport maven 會完成依賴新增,下載依賴包到本地。
執行maven的各個生命週期:當需要新增的依賴全部寫入專案的pom.xml檔案的時候,就可以進行程式碼開發,之後執行整個maven的生命週期,構建專案
構建專案使用Idea 的view-tool window 裡面有maven project 的window裡面提供了快捷的maven週期相關的操作,幫助快速進行專案構建。

Pom 檔案結構詳解

pom.xml是maven專案的核心,它反映了整個專案的資訊,包含專案的結構,專案的依賴,專案的外掛以及專案如何進行build等資訊。

maven專案的完整生命週期

我們知道maven操作專案有一個完整的生命週期:clean,validate,compile,test,package,install,site,deploy. 預設的情況下如果從中間的某一個週期執行其相關的指令,之前的生命週期中需要執行的過程預設都要執行,
但是可以選擇跳過某些過程,比如test的過程可以選擇性的跳過mvn Dmaven.test.skip=true package 可以在打包時跳過test的過程。