maven 加入第三方库_关于maven,你还要翻阅多少资料才能整理出这一份完整文档...
一、介紹
Maven是一款Apache基金會下的項目構建工具,可以用來任何基于Java的項目,遵循約定由于配置的思想,能夠大大簡化我們工作中繁瑣的項目構建。官網地址:http://maven.apache.org/
二、環境安裝
1、下載
下載地址:http://maven.apache.org/download.cgi
下載頁面2、解壓
a) 如果是windows環境,直接用解壓工具解壓
b) 如果是Linux環境
tar -zxvf apache-maven-3.6.0-bin.tar.gz3、環境變量配置
a) windows下的環境變量,計算機->屬性->高級系統設置-->環境變量
M2_HOME配置Path配置b) Linux服務器
export M2_HOME = /opt/softwares/apache-maven-3.6.0 export PATH = PATH;M2_HOME/binc) 檢查是否安裝正確
mv -v # 輸出版本號 echo $M2_HOME # Linux下輸出環境變量路徑4、安裝目錄說明
安裝目錄說明說明:
bin:該目錄下mvn、mvnDebug是基于Linux平臺的shell腳本,mvn.bat、mvnDebug.bat是基于Windows平臺的bat腳本,在命令行輸入mvn命令時實際上是調用mvn或mvn.bat腳本。mvn和mvnDebug的區別是mvnDebug多了一條MAVENDEBUGOPTS配置,作用是運行Maven時開啟debug模式以調試Maven本身。m2.conf文件是classworlds的配置文件,Maven啟動時會自動加載。
boot: 該目錄只包含一個文件plexus-classworlds-2.5.2.jar,plexus-classworlds是一個類加載器框架,相對于默認的java類加載器,它提供了更加豐富的語法以便配置,Maven使用該框架加載自己的類庫。
conf: 該目錄包含了Maven的配置文件settings.xml,可以指定2種級別:全局級別:直接修改maven/conf/settings.xml文件可以全局定制Maven的行為,對一臺機器上的所有用戶有效。用戶級別:將該文件復制到maven/conf/settings.xml文件可以全局定制Maven的行為,對一臺機器上的所有用戶有效。用戶級別:將該文件復制到{user.home}/.m2/目錄下,然后修改settings.xml配置,在當前用戶范圍內定制Maven的行為。
lib: 該目錄包含了所有Maven運行時需要的Java類庫,Maven本身是分模塊的maven-*.jar都是maven自己的包,還有很多第三方依賴包。
LICENSE: Maven使用的軟件許可證是Apache LicenseVersion 2.0。
NOTICE: Apache Maven Distribution使用的第三方軟件。
README.txt: Maven的簡明介紹,包括系統要求、安裝說明、Maven URLS等。
三、基本命令
Maven項目構建過程中,主要構建命令有幾種:
- mvn validate 驗證,驗證項目是正確的并且所有的信息是可用的;
- mvn clean 清理,清理項目緩存輸出,一般是target文件夾被刪除;
- mvn compile 編譯,將java源文件編譯成.class文件;
- mvn test 測試,生成測試報告,運行test目錄下的所有單元測試;
- mvn package 打包,將項目打成jar、war或者pom;
- mvn install 安裝,將當前項目安裝到本地maven庫,供其他項目依賴;
- mvn deploy部署,在構建環境中完成,復制最終的包到遠程庫。
執行后面的命令會自動執行前面的命令,比如執行mvn package時會執行validate、clean、compile、test、package五個階段。
執行過程四、核心概念
1、項目對象模型(POM)
Maven根據項目的pom.xml文件,把它轉化成項目對象模型(POM),然后對其進行管理
項目對象模型<?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> ?<groupId>com.mage</groupId><artifactId>film</artifactId><version>1.0</version><packaging>war</packaging> ?<name>Film</name><description>Demo project for Spring Boot</description> ?<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent> ?<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties> ?<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency></dependencies><build><finalName>film</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> </project>a) 基本信息
modelVersionMaven模塊版本,目前我們一般都取值4.0.0groupId必選,組織名稱,一般用戶包路徑。artifactId必選,模塊名稱,一般是項目或者模塊名字。version必選,版本packaging可選,默認是jar,打包類型,可取值:jar,war,pom等。
b) 依賴dependencies
groupId依賴項的groupIdartifactId依賴項的artifactIdversion依賴項的版本scope依賴項的適用范圍: compile,缺省值,適用于所有階段,會隨著項目一起發布。 provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。 runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。 test,只在測試時使用,用于編譯和運行測試代碼。不會隨項目發布。 system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。之前例子里的junit就只用在了test中。exclusions排除項目中的依賴,解決沖突時使用。exclusion去除依賴項,如果X需要A,A包含B依賴,那么X可以聲明不要B依賴,只要在exclusions中聲明exclusion.
Maven從倉庫解析依賴的機制
當本地倉庫沒有依賴構件的時候,Maven會自動從遠程倉庫下載;當依賴版本為快照版本時,Maven會自動找到最新的快照。
當依賴的版本不明晰的時候,如RELEASE、LASTEST、SNAPSHOT,Maven就需要基于更新遠程倉庫的更新策略來檢查更新。
c) 其他元素
- properties:配置
- dependencyManagement:配置依賴管理
- build :插件列表,下面包含有plugins和resources
- parent:父項目
- modules:聚合多個模塊
2、POM關系
a) 依賴管理
依賴管理分為傳遞性依賴、依賴調解、可選依賴、排除依賴、歸類依賴等。
傳遞性依賴
maven模塊 -> spring-jdbc -> spring-core -> commons-logging
假設: A -> B -> C,即A對B是第一直接依賴,B對C是第二直接依賴,A對C是傳遞性依賴,第一直接依賴(簡稱F)和第二直接依賴(簡稱S)的范圍決定了傳遞性依賴(簡稱T)的范圍。如圖所示:
依賴的范圍例如:A -> B -> C,A依賴B的范圍是test,B依賴C的范圍是compile,則A傳遞依賴C的范圍是test。
結論:當S=compile時,T與F的范圍一致;當S=test時,依賴不會傳遞;當S=provided時,只有當F=provided時,T=provided;當S=runtime時,T=F,但F=compile例外,此時T=runtime.
依賴調解
依賴調解第一原則:路徑最近者優先。
例如:A -> B -> C -> X1 長度為3 A -> D -> X2 長度為2,因此X2會被解析使用 依賴調解第二原則:第一原則優先,依賴路徑相等時,POM中依賴聲明順序靠前的優先。
例如:A -> B -> X1 長度為2 A -> C -> X2 長度為2,但是POM文件中B的依賴聲明靠前,因此X1會被解析使用。
可選依賴
A依賴于B,B依賴于X和Y,B對于X和Y的依賴都是可選依賴,即optional=true
A?B、B?X(可選)、B?Y(可選)。可選依賴不會傳遞,即X、Y對A沒有影響。
可選依賴一般是多種互斥的特性,具體使用時只選其一。
可選依賴的互斥特性排除依賴
使用exclusions元素聲明排除依賴,exclusions包含一個或者多個exclusion子元素,因此可以排除一個或者多個傳遞性依賴。注意聲明exclusion時只需要groupId和artifactId,而不需要version元素,因為只需要groupId和artifactId就可以唯一定位依賴圖中的某個依賴。
歸類依賴
spring的依賴包版本都是相同的,可以使用properties元素定義Maven屬性spring.version=4.x
在定義依賴時可以使用美元符號加大括弧環繞的方式來引用Maven屬性,例如${spring.version}。
b) 聚合
聚合:多個項目或者模塊聚合到一起,建立一個package方式為pom的項目parent專門負責聚合工作,并使用modules-module指定子模塊,目的是快速構建項目。
聚合模塊視圖c) 繼承
繼承:多個模塊聚合時,子模塊需要繼承父模塊以消除重復配置。
繼承關系下的模塊3、生命周期和插件
Maven的生命周期就是對所有的構建過程進行抽象和統一。包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有的構建步驟。Maven的生命周期是抽象的,即生命周期不做任何實際的工作,實際任務由插件完成,類似于設計模式中的模板方法。
a) 三套生命周期
Maven有三套相互獨立的生命周期,分別是clean、default和site。每個生命周期包含一些階段(phase),階段是有順序的,后面的階段依賴于前面的階段。
1 、clean生命周期:清理項目,包含三個phase。
1)pre-clean:執行清理前需要完成的工作
2)clean:清理上一次構建生成的文件
3)post-clean:執行清理后需要完成的工作
2 、default生命周期:構建項目,重要的phase如下
1)validate:驗證工程是否正確,所有需要的資源是否可用。
2)compile:編譯項目的源代碼。
3)test:使用合適的單元測試框架來測試已編譯的源代碼。這些測試不需要已打包和布署。
4)Package:把已編譯的代碼打包成可發布的格式,比如jar。
5)integration-test:如有需要,將包處理和發布到一個能夠進行集成測試的環境。
6)verify:運行所有檢查,驗證包是否有效且達到質量標準。
7)install:把包安裝到maven本地倉庫,可以被其他工程作為依賴來使用。
8)Deploy:在集成或者發布環境下執行,將最終版本的包拷貝到遠程的repository,使得其他的開發者或者工程可以共享。
3 、site生命周期:建立和發布項目站點,phase如下
1)pre-site:生成項目站點之前需要完成的工作
2)site:生成項目站點文檔
3)post-site:生成項目站點之后需要完成的工作
4)site-deploy:將項目站點發布到服務器
b 理解生命周期
各個生命周期相互獨立,一個生命周期的階段前后依賴。舉例如下:
mvn clean:調用clean生命周期的clean階段,實際執行pre-clean和clean階段;mvn test調用default生命周期的test階段,實際執行test以及之前所有階段
mvn clean install
調用clean生命周期的clean階段和default的install階段,實際執行pre-clean和clean,install以及之前所有階段
c) 插件
Maven本質上是一個插件框架,它的核心并不執行任何具體的構建任務,所有這些任務都交給插件來完成,例如編譯源代碼是由maven- compiler-plugin完成的。進一步說,每個任務對應了一個插件目標(goal),每個插件會有一個或者多個目標,例如maven- compiler-plugin的compile目標用來編譯位于src/main/java/目錄下的主源碼,testCompile目標用來編譯位于src/test/java/目錄下的測試源碼。用戶可以通過兩種方式調用Maven插件目標。
第一種方式是將插件目標與生命周期階段(lifecycle phase)綁定,這樣用戶在命令行只是輸入生命周期階段而已,例如Maven默認將maven-compiler-plugin的compile目標與 compile生命周期階段綁定,因此命令mvn compile實際上是先定位到compile這一生命周期階段,然后再根據綁定關系調用maven-compiler-plugin的compile目標。
第二種方式是直接在命令行指定要執行的插件目標,例如mvn archetype:generate 就表示調用maven-archetype-plugin的generate目標,這種帶冒號的調用方式與生命周期無關。在執行生命周期時,使用都是插件,如
插件很多: http://maven.apache.org/plugins/index.html
添加一個 打包源碼的插件
<plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.4</version><executions><execution><phase>package</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin> </plugins> ?即:
插件代碼示例4、倉庫
Maven倉庫分為兩類:本地倉庫和遠程倉庫。當Maven根據坐標尋找構件時,首先會查看本地倉庫,若本地倉庫存在此構件則直接使用;若本地倉庫不存在此構件,Maven就會去遠程倉庫查找,查找到下載到本地倉庫再使用。若本地倉庫和遠程倉庫都沒有需要的構件,Maven就會報錯。
a) 倉庫分類
中央倉庫: Maven核心自帶的遠程倉庫,包含了絕大部分開源構件,默認情況,當本地倉庫沒有Maven需要構件時,就從中央倉庫下載。
Maven默認的中央倉庫為,在apache-maven-3.3.9lib中找到:
jar包示例使用解壓工具找到pom.xml
xml文件代碼示例私服:特殊的遠程倉庫,架設在局域網內的倉庫服務,代理公網的遠程倉庫,當Maven需要下載構件時,從私服請求,若私服不存在該構件,則從公網遠程倉庫下載,緩存到私服之后,再為Maven的下載請求提供服務。另外無法從公網倉庫下載的構件也能從本地上傳到私服供項目使用。
本地倉庫:用戶自定義本地倉庫的地址,需編輯${user.home}/.m2/setting.xml文件,設置localRepository節點的值為倉庫地址即可,默認情況下${user.home}/.m2/setting.xml是不存在的,需要用戶從安裝目錄復制${M2_HOME}/conf/setting.xml文件在進行編輯。
<settings><localRepository>C:/maven/repository</localRepository> </settings>b) 倉庫鏡像
我們發現使用默認的maven官方的倉庫(更新依賴庫),網速一個是比較慢,一個是因為被墻,一些jar包無法下載,非常老火。配置其他快速的maven倉庫鏡像。
官方鏡像
<mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror>阿里鏡像
<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>配置鏡像
編輯conf/settings.xml配置中央倉庫鏡像:
鏡像代碼示例三個元素id,name,url與一般倉庫配置無異,表示該鏡像倉庫的唯一標識符、名稱以及地址。其中<mirrorOf>:
值說明Central中央倉庫的鏡像,任何對于中央倉庫的請求都會轉至該鏡像,用戶也可以使用同樣的方法配置其他倉庫的鏡像。*匹配所有遠程倉庫external:*匹配所有遠程倉庫,使用localhost的除外,使用file://協議的除外。也就是說,匹配所有不在本機上的遠程倉庫。repo1,repo2匹配倉庫repo1和repo2,使用逗號分隔多個遠程倉庫。*,!repo1匹配所有遠程倉庫,repo1除外,使用感嘆號將倉庫從匹配中排除。
需要注意的是,由于鏡像倉庫完全屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者停止服務的時候,Maven仍將無法訪問被鏡像倉庫,因而將無法下載構件。
總結
以上是生活随笔為你收集整理的maven 加入第三方库_关于maven,你还要翻阅多少资料才能整理出这一份完整文档...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称沃尔沃 EX60 纯电 SUV 将
- 下一篇: acl审计软件_什么是IT审计员?风险评