小饒學程式設計之JAVA EE第三部分——專案管理工具:4Maven

溫文爾雅的清歡渡發表於2020-12-31

一、開發中遇到的問題

1、都是同樣的程式碼,為什麼在我的機器上可以編譯執行,而在他的機器上就不行?

2、為什麼在我的機器上可以正常打包,而配置管理員卻打不出來?

3、專案組加入了新的人員,我要給他說明編譯環境如何設定,但是讓我撓頭的是,有些細節我也記不清楚了。

4、我的專案依賴一些jar包,我應該把他們放哪裡?放原始碼庫裡?

5、這是我開發的第二個專案,還是需要上面的那些jar包,再把它們複製到我當前專案的svn庫裡吧

6、現在是第三次,再複製一次吧 ----- 這樣真的好嗎?

7、我寫了一個資料庫相關的通用類,並且推薦給了其他專案組,現在已經有五個專案組在使用它了,今天我發現了一個bug,並修正了它,我會把jar包通過郵件發給其他專案組

-----這不是一個好的分發機制,太多的環節可能導致出現bug

8、 專案進入測試階段,每天都要向測試伺服器部署一版。每次都手動部署,太麻煩了。

二、maven

Maven是基於POM(工程物件模型),通過一小段描述來對專案的程式碼、報告、檔案進管理的工具。

Maven是一個跨平臺的專案管理工具,它是使用java開發的,它要依賴於jdk1.6及以上

Maven主要有兩大功能:管理依賴、專案構建。

依賴指的就是jar包。

2.1什麼是構建

繪製構建流程圖

2.2構建過程

在這裡插入圖片描述

2.3專案構建的方式

1、 Eclipse

使用eclipse進行專案構建,相對來說,步驟比較零散,不好操作

2、 Ant

它是一個專門的專案構建工具,它可以通過一些配置來完成專案構建,這些配置要明確的告訴ant,原始碼包在哪?目標class檔案應該存放在哪?資原始檔應該在哪

3、 Maven

它是一個專案管理工具,他也是一個專案構建工具,通過使用maven,可以對專案進行快速簡單的構建,它不需要告訴maven很多資訊,但是需要安裝maven去的規範去進行程式碼的開發。也就是說maven是有約束的。

三、maven的安裝

3.1下載

官方網站:http://maven.apache.org

下載完成後直接解壓

3.2安裝

第一步:配置maven的環境變數MAVEN_HOME

在這裡插入圖片描述

第二步:配置maven的環境變數PATH
在這裡插入圖片描述

第三步:測試maven是否安裝成功,在系統命令列中執行命令:mvn –v

在這裡插入圖片描述

3.3 配置maven

在maven中有兩個配置檔案:使用者配置、全域性配置(預設)

3.3.1 全域性配置

在maven安裝目錄的conf裡面有一個settings.xml檔案,這個檔案就是maven的全域性配置檔案。

該檔案中localRepository用來配置maven本地倉庫的地址
在這裡插入圖片描述

預設在系統的使用者目錄下的m2/repository中,該目錄是本地倉庫的目錄。

在這裡插入圖片描述

3.3.2 使用者配置

使用者配置檔案的地址:~/.m2/settings.xml,該檔案預設是沒有,需要將全域性配置檔案拷貝一份到該目錄下。
在這裡插入圖片描述

重新指定本地倉庫地址,如果不指定,則預設是~/.m2/repository目錄,如果使用者配置檔案不存在,則使用全域性配置檔案的配置。
在這裡插入圖片描述

3.3.3修改Maven中央倉庫地址

Maven是當前流行的專案管理工具,但官方的庫在國外經常連不上,連上也下載速度很慢。因此我們可以修改中央倉庫地址為國內一些企業提供的地址。

修改 m a v e n . h o m e / c o n f 或 者 {maven.home}/conf或者 maven.home/conf{user.home}/.m2資料夾下的settings.xml檔案,在標籤下加入上述內容即可。如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <!-- 阿里雲倉庫 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>https://maven.aliyun.com/repository/central</url>
        </mirror>
    
        <!-- 中央倉庫1 -->
        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>
    
        <!-- 中央倉庫2 -->
        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>
    </mirrors> 
</settings>

四、建立maven工程

4.1Maven工程結構

Project

​ |–src(原始碼包)

​ |–main(正常的原始碼包)

​ |–java(.java檔案的目錄)

​ |–resources(資原始檔的目錄)

​ |–test(測試的原始碼包)

|–java

​ |–resources

​ |–target(class檔案、報告等資訊儲存的地方)

​ |–pom.xml(maven工程的描述檔案)

4.2建立maven工程

4.2.1使用命令列建立

建立java工程

mvn archetype:generate -DgroupId=包名 -DartifactId=專案名稱 -DarchetypeArtifactId=maven-archetype-quickstart

建立web工程

mvn archetype:generate -DgroupId=包名 -DartifactId=專案名稱 -DarchetypeArtifactId=maven-archetype-webapp

4.2.2使用eclipse建立

右鍵—>Maven—>Maven Project,選擇模板,填寫包名,專案名稱即可。

4.3Maven命令的使用

4.3.1 Maven compile

編譯的命令

4.3.2 Maven clean

清除命令,清除已經編譯好的class檔案,具體說清除的是target目錄中的檔案

4.3.3 Maven test

測試命令,該命令會將test目錄中的原始碼進行編譯

4.3.4Maven package

打包命令

4.3.5 Maven install

安裝命令,會將打好的包,安裝到本地倉庫

4.3.6組合命令

以上命令可以進行組合使用,如:

mvn clean compile
mvn clean test
mvn clean package
mvn clean install

五、M2Eclipse

5.1下載外掛

5.2檢視是否安裝成功

在這裡插入圖片描述

5.3、設定maven安裝路徑

在這裡插入圖片描述

5.4、設定Maven的使用者配置

在這裡插入圖片描述

5.5、建立工程

eclipse中建立maven工程可以分為兩種,一種是使用模板建立,一種是不使用模板建立。

六、Maven的核心概念

6.1 座標

6.1.1、 什麼是座標?

在平面幾何中座標(x,y)可以標識平面中唯一的一點。在maven中座標就是為了定位一個唯一確定的jar包。

Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規範

擁有了統一規範,就可以把查詢工作交給機器

6.1.2、 Maven座標主要組成

groupId:定義當前Maven組織名稱

artifactId:定義實際專案名稱

version:定義當前專案的當前版本

6.2 依賴管理

6.2.1、 依賴範圍

在這裡插入圖片描述

其中依賴範圍scope 用來控制依賴和編譯,測試,執行的classpath的關係. 主要的是三種依賴關係如下:

1.compile: 預設編譯依賴範圍。對於編譯,測試,執行三種classpath都有效

2.test:測試依賴範圍。只對於測試classpath有效

3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於執行無效。因為由容器已經提供,例如servlet-api

4.runtime:執行時提供。例如:jdbc驅動

6.2.2 依賴傳遞

A、B、C

B工程依賴A工程,C工程依賴B工程,那麼B工程是C工程的直接依賴,A工程是C工程的間接依賴

6.2.2.1建立MavenThird工程

第一步:建立mavenThird工程

第二步:建立MavenThird.java

在這裡插入圖片描述

第三步:建立TestMavenThird.java

6.2.2.2 分析第一解決依賴和第二直接依賴

在這裡插入圖片描述

6.2.2.3 依賴範圍傳遞

在這裡插入圖片描述

上面第一行表示第二直接依賴範圍

中間的交叉單元格表示傳遞性依賴範圍。

總結:

Ø 當第二依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致。

Ø 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞。

Ø 當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也為provided的依賴,且傳遞性依賴的範圍同樣為 provided;

Ø 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍為runtime;

6.2.3 依賴衝突

在maven中存在兩種衝突方式:一種是跨pom檔案的衝突,一致是同一個pom檔案中的衝突。

6.2.3.1跨pom檔案的衝突

MavenFirst的pom檔案中依賴來junit的4.9版本,那邊MavenSecond和MavenThird中都是使用了4.9版本。

在這裡插入圖片描述

如果MavenSecond中重新依賴junit的4.8版本,那麼MavenSecond和MavenThird中都是使用了4.8本,這體現來依賴的就近使用原則。

在這裡插入圖片描述

依賴的jar包如下:

在這裡插入圖片描述

6.2.3.2同一個pom檔案的衝突

在這裡插入圖片描述

6.2.4 可選依賴

Optional標籤標示該依賴是否可選,預設是false。可以理解為,如果為true,則表示該依賴不會傳遞下去,如果為false,則會傳遞下去。

在這裡插入圖片描述

6.2.5 排除依賴

Exclusions標籤可以排除依賴

在這裡插入圖片描述

6.3 生命週期

Maven有三個生命週期:clean生命週期、default生命週期、site生命週期

生命週期可以理解為專案構建的步驟集合。

生命週期是由多個階段(Phase)組成。每個階段都是一個完整的功能,比如mvn clean中的clean就是一個階段。

6.3.1 Clean生命週期

pre-clean 執行一些需要在clean之前完成的工作

clean 移除所有上一次構建生成的檔案

post-clean 執行一些需要在clean之後立刻完成的工作

mvn clean命令,等同於 mvn pre-clean clean。只要執行後面的命令,那麼前面的命令都會執行,不需要再重新去輸入命令。

有Clean生命週期,在生命週期又有clean階段。

6.3.2 Default生命週期(重點)

validate

generate-sources

process-sources

generate-resources

process-resources 複製並處理資原始檔,至目標目錄,準備打包。

compile 編譯專案的原始碼。

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources 複製並處理資原始檔,至目標測試目錄。

test-compile 編譯測試原始碼。

process-test-classes

test 使用合適的單元測試框架執行測試。這些測試程式碼不會被打包或部署。

prepare-package

package 接受編譯好的程式碼,打包成可釋出的格式,如 JAR 。

pre-integration-test

integration-test

post-integration-test

verify

install 將包安裝至本地倉庫,以讓其它專案依賴。

deploy 將最終的包複製到遠端的倉庫,以讓其它開發人員與專案共享。

在maven中,只要在同一個生命週期,你執行後面的階段,那麼前面的階段也會被執行,而且不需要額外去輸入前面的階段,這樣大大減輕了程式設計師的工作。

6.3.3 Site生命週期

pre-site 執行一些需要在生成站點文件之前完成的工作

site 生成專案的站點文件

post-site 執行一些需要在生成站點文件之後完成的工作,並且為部署做準備

site-deploy 將生成的站點文件部署到特定的伺服器上

6.4 外掛

外掛(plugin),每個外掛都能實現一個階段的功能。Maven的核心是生命週期,但是生命週期相當於主要指定了maven命令執行的流程順序,而沒有真正實現流程的功能,功能是有外掛來實現的。

比如:compile就是一個外掛實現的功能。

6.4.1 編譯外掛

在這裡插入圖片描述

6.4.2 Tomcat外掛

預設輸入tomcat:run去使用tomcat外掛來啟動web工程,但是預設的tomcat外掛使用的tomcat版本是tomcat6

而目前主流的tomcat,是使用的tomcat7,需要手動配置tomcat外掛

在這裡插入圖片描述

使用tomcat7來執行web工程,它的命令是:tomcat7:run

6.5、繼承

建立繼承專案

6.6、聚合

建立聚合專案

七、倉庫

7.1、什麼是Maven倉庫

用來統一儲存所有Maven共享構建的位置就是倉庫。根據Maven座標定義每個構建在倉庫中唯一儲存路徑大致為:groupId/artifactId/version/artifactId-version.packaging

7.2、倉庫的分類

  • 本地倉庫

預設在~/.m2/repository,如果在使用者配置中有配置,則以使用者配置的地址為準

  • 遠端倉庫

中央倉庫

http://repo1.maven.org/maven2

  • 私服

7.3、私服

在這裡插入圖片描述

相關文章