Maven學習筆記

一、Maven是什麼?有什麼優點?

Maven介紹

Maven項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的項目管理工具軟件

Maven優點

  • 解決jar包衝突的問題
  • 解決jar包依賴的問題
  • jar文件不用在每個項目保存,只需要放在倉庫
  • maven可以指定jar的依賴範圍

二、Maven目錄結構

在這裏插入圖片描述
Maven創建項目的的目錄結構大體如圖所示,src下包含main和test目錄,這兩個目錄下又包含java和resources目錄,分別存放項目的代碼以及測試的代碼
target目錄下的class目錄則是存放編譯後的代碼
而Maven的核心文件pom.xml便是資源文件,確定該項目需要使用哪些jar包的座標,並通過該座標在中央倉庫進行自動下載。

三、利用Idea開發工具創建Maven項目

這裏以創建Maven-web項目爲例

四、配置本地倉庫

首先本地倉庫是什麼?

英文名爲localRepository,它是用來存儲從遠程倉庫或中央倉庫下載的插件和jar包,項目使用一些插件或jar包,優先從本地倉庫查找。
在這裏插入圖片描述
作爲使用者,我們往往想指定自己創建的一個目錄作爲本地倉庫,那我們應該怎麼做呢?
做法其實很簡單,我們找到Maven安裝目錄下的conf目錄下的settings.xml
然後修改settings.xml文件的內容
在這裏插入圖片描述
在框中的標籤裏將你指定的目錄地址替換掉就ok了,這樣以後通過Maven下載的jar包都會存在這裏,當本地倉庫沒有對應的jar包的時候,Maven會自己去中央倉庫中尋找並下載到本地倉庫。

五、有關Maven常用的項目構建命令

下圖表格是Maven常用的項目構建命令

命令 描述
mvn clean 清除項目原來的編譯結果
mvn compile 編譯源文件
mvn test 運行測試代碼
mvn package 打包項目war/jar
mvn install 打包並安裝到本地倉庫
mvn deploy 發佈到本地倉庫或者服務器

六、Maven座標

Maven座標的主要組成
groupId:定義當前Maven項目的隸屬項目、組織
artifactId:定義實際項目的一個模塊
version:定義當前項目的版本
packaging:定義該項目的打包方式(jar/war,默認爲jar)
例子:

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
</dependency>

那我們如何去讓Maven自動下載我們想要的jar包
首先我們去官網https://mvnrepository.com/在裏面搜索我們想要的jar包
比如 mysql-connector-java這個包
在這裏插入圖片描述
然後點擊search,點擊下圖所示
在這裏插入圖片描述
這裏有這個包的各種版本,點擊你想要的的版本
在這裏插入圖片描述
然後就能看到對應的座標了,將這個座標信息複製到pom.xml文件的dependencses標籤下,Maven就會自動下載jar包並放進本地倉庫
在這裏插入圖片描述

七、Maven的依賴範圍

在每個dependency標籤裏面都有一個子標籤scope
他有以下幾個屬性
在這裏插入圖片描述

  1. compile:編譯域,這個是Maven中scope的默認值,不寫scope配置時默認就是使用這個值,compile表示被依賴項目需要同當前項目編譯時一起編譯,項目測試期以及本項目運行時同樣生效,打包的時候需要包含進去
  2. test:測試域,表示被依賴的項目僅僅在項目進行測試時生效,項目運行時不會生效
  3. provided:表示打包的時候不用講provided域的包打進去
  4. runtime:運行域,表示被依賴的項目不會參與項目的編譯,但項目的測試時期和運行時期會參與,與compile相比,跳過了編譯時期。
  5. system:跟provide相似,但是在系統中要以外部jar包的形式提供,Maven不會在倉庫中查找它
  6. import:只使用在< dependencyManagement >中,表示從其他pom文件中導入dependency的配置

八、Maven可選依賴和依賴排除

可選依賴:是否希望將該依賴向下傳遞? 默認爲false,向下傳遞,如果選擇true則不向下傳遞

<!-- spring-boot-devtools -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional> <!-- 表示依賴不會傳遞 -->
</dependency>

排除依賴:

如果一個項目A依賴另一個項目B時,會將B項目的依賴jar包都會依賴。

但如果不想依賴B項目中的某一個依賴時,可設置exclusions排除指定的依賴

<!-- 定時任務 -->
<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <exclusions>
      <exclusion>
         <groupId>com.mchange</groupId>
         <artifactId>c3p0</artifactId>
      </exclusion>
   </exclusions>

九、Maven項目的繼承

作用:在使用的時候子工程直接繼承父工程的版本號,子工程中不再需要指定版本號,方便統一管理項目的依賴版本問題。
下面用代碼展示
首先創建一個父工程

<?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>org.learn.maven</groupId>
    <artifactId>mavendemo-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mavendemochild</module>
    </modules>
    <packaging>pom</packaging>
    <description>父工程</description>
 
    <!--抽取子工程的依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
        </dependencies>
 
    </dependencyManagement>
 
 
</project>

我們可以看到有一個dependencyManagement標籤,父工程在這個標籤下定義子工程依賴的jar包

然後再創建一個子工程

<?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">
    <!--引用父工程-->
    <parent>
        <artifactId>mavendemo-parent</artifactId>
        <groupId>org.learn.maven</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
 
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>org.learn.maven</groupId>
    <artifactId>mavendemochild</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
 
    </dependencies>
</project>

這個時候子工程的座標中就不需要定義version這個標籤了,由父類統一管理
同時要注意子類的pom.xml文件中parent標籤裏要將父工程的座標複製過去

十、Maven的聚合

Maven:將多個Maven模塊整合在一起稱爲聚合
好處:可以將多個模塊整體運行,不需要先將被依賴的模塊打包至倉庫再運行項目。

假如MavenA 依賴MavenB,如果只是在MavenA模塊的pom.xml中dependency MavenB,則必須先將MavenB安裝並打包至倉庫。
通常我們會新創建一個聚合項目,這個項目作爲一個載體將項目的所有的模塊都整合在一起。

我們只需要在這個載體上加上

<modules>
    <module>MavenA</module>
    <module>MavenB</module>
</modules>

下面舉個例子:
首先創建mavendemoservice項目
pom.xml文件如下

<?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>org.learn.maven</groupId>
    <artifactId>mavenservice</artifactId>
 
 
</project>

創建mavenweb模塊,增加service的依賴,但是我們此前是沒有把mavendedoservice這個模塊install進倉庫的
pom.xml如下

<?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>org.learn.maven</groupId>
    <artifactId>mavenweb</artifactId>
 
    <!--依賴Service模塊-->
    <dependencies>
        <dependency>
            <groupId>org.learn.maven</groupId>
            <artifactId>mavenservice</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

再創建一個作爲載體的工程
pom.xml如下

<?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>org.learn.maven</groupId>
    <artifactId>mavendemo-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mavenservice</module>
        <module>mavenweb</module>
    </modules>
    <packaging>pom</packaging>
    <description>父工程</description>
 
    <!--抽取子工程的依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.1.7.RELEASE</version>
            </dependency>
 
        </dependencies>
 
    </dependencyManagement>
 
</project>

在modules標籤下創建module,注意module裏面寫的是要聚合項目的路徑,可以用相對路徑

本篇文章依舊是作爲個人的學習筆記,如有見解不到之處還望指教

有蠻多內容是從這個博客學習的,附上鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章