Maven構建項目的生命周期
? ? 在Maven出現之前,項目構建的生命周期就已經存在,軟件開發人員每天都在對項目進行清理,編譯,測試,部署等工作,這個過程就是項目構建的生命周期。雖然大家都在不停的做構建工作,但公司與公司之間,項目與項目之間構建項目的方式有所不同。
? ? Maven對所有的構建過程進行了抽象和統一。Maven構建項目的生命周期包含了項目清理,初始化,編譯,測試,打包,集成測試,驗證,部署和站點生成等幾乎所有構建步驟。
Maven的常用命令?
mvn clean:調用clean生命周期的clean階段,清理上一次構建項目生成的文件;
mvn compile :編譯src/main/java中的java代碼;
mvn test :編譯并運行了test中內容 ;
mvn package:將項目打包成可發布的文件,如jar或者war包;?
mvn install :發布項目到本地倉庫 ;
POM
pom(Project Object Model)指的是項目對象模型,用來描述當前的maven項目。
Setting.xml文件主要用于配置maven的運行環境等一系列通用屬性,是全局級別的配置文件,而pom.xml文件主要描述項目的maven坐標,依賴關系,開發者需要遵循的規則,組織等與項目相關的因素,是項目級別的配置文件。
依賴管理
依賴導入
? ? 就是對jar包的管理,以往我們需要下載好xxxx.jar的jar包,粘貼到工程的lib目錄下面去,使用maven的依賴管理功能,想要引入某個包只需要導入maven的坐標即可(它會通過坐標找到對應的jar包并下載到本地的maven倉庫)。
maven中央倉庫地址:https://mvnrepository.com/
比方說我要導入junit的jar包,前往中央倉庫搜索:junit
可以選擇人數較多的版本:
隨后復制它的坐標:
將坐標復制到我們項目的pom.xml文件中(注意要在dependencies)標簽中:
依賴范圍設置
?在默認情況下,依賴可以在任何地方可用,可以通過<scope>標簽設置作用的范圍,作用范圍主要有三種:
- 主程序范圍有效(src/main)目錄范圍內
- 測試程序范圍內有效(src/test)目錄范圍內
- 是否參與打包(package指令范圍內)
依賴范圍 | 編譯源碼 | 編譯測試代碼 | 測試運行 | 運行項目 | 示例 |
---|---|---|---|---|---|
compile | Y | Y | Y | Y | spring-web |
test | - | Y | Y | - | junit |
provide | Y | Y | Y | - | servlet-api |
runtime | - | Y | Y | Y | jdcb |
system | Y | Y | Y | - | 本地的jar包 |
依賴版本維護
? ? 如果pom文件中引入的依賴太多,各種依賴又有不同的版本,為了統一維護版本,我們可以將依賴的版本號抽取出來進行統一管理。具體操作的步驟如下:
- 在pom.xml中使用<propeties>屬性定義jar包的版本。
- 在依賴的<version>中使用${}引入前面定義好的版本
依賴傳遞
當在項目中引入一個jar包時引入的jar包所依賴的jar也會跟著傳遞進來:
依賴沖突?
? ? 一個項目可能會依賴多個庫或模塊,而這些庫或模塊又可能會依賴同一個類庫的不同版本。當這些不同版本的類庫被同時引入時,就會發生依賴沖突。
? ? 比如使用Maven導入了一個Servlet的包,當項目部署到Tomcat后產生了jar包沖突,因為在Tomcat服務器內置了servlet的jar。這就會造成依賴沖突。
解決依賴沖突的方法
- 使用maven提供的依賴調節原則(自動)
- 排除依賴,排除依賴的jar包
- 鎖定版本
使用maven提供的依賴調節原則
第一聲明者優先原則:
在pom.xml文件中,先聲明哪個jar包,就以那個jar包為主。
路徑近者優先原則:
優先使用我們自己導入的jar包,依賴中傳遞的jar包排其次,直接依賴高于間接依賴。
排除依賴,排除依賴的jar包
在<dependency>內導入jar包時,使用<exclusions>標簽,在<exclusions>標簽內使用<exclusion>包含需要排除的標簽:
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.2.4.RELEASE</version><!-- 排除依賴的jar包 --><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion></exclusions></dependency>
鎖定版本
使用<dependencyManagement>(與dependencies同級):
<dependencyManagement><dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version></dependency></dependencies></dependencyManagement>
設置好版本號后,無需在dependencies標簽內再設置version:
項目模塊化?
? ? Maven項目的模塊化是一種將大型項目拆分成多個獨立但相互關聯的模塊(Module)的方法。每個模塊負責一部分功能,這樣不僅可以提高項目的可維護性、可擴展性和可重用性,還能有效隔離各個模塊之間的依賴,簡化項目的管理。
Maven項目的繼承
? ? 在Java語言中,類之間是可以繼承的,通過繼承,子類就可以引用父類中非private的屬性和方法。同樣,在maven工程之間也可以繼承,子工程繼承父工程后,就可以使用在父工程中引入的依賴。繼承的目的是為了消除重復代碼。
被繼承的Maven工程是父工程,父工程的packaging的打包方式必須為pom
?基礎其他Maven工程為子過程,在pom.xml文件中通過parent標簽進行父工程繼承
?Maven項目的聚合
? ? 在maven父工程的pom.xml文件中可以使用<modules>標簽將其他maven工程聚合到一起,聚合的目的是為了進行統一操作。
?
示例:
先創建一個工程,將packaging配置為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.f</groupId><artifactId>father</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
在目錄下新建模塊web,子模塊的xml為:
可以看到自動有了parent標簽
<?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><parent><groupId>com.f</groupId><artifactId>father</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>web</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
此時父工程自動添加了?<modules>標簽: