Maven學習總結


一、Maven概念

一個 基於Java平台自動化構建工具 ,幫助我們管理jar包和拆分項目,其他類似的構建工具有 make-ant-maven-gradle。

基於Java平台:安裝maven前一定要配置好JDK環境。

自動化構建工具:eclipse就是自動化構建工具,幫助我們把java編譯為class文件。

二、Maven安裝

(1)下載JDK並配置環境變量。

(2)下載maven(http://maven.apache.org/download.cgi)。

(3)解壓安裝包,並配置maven環境變量。

  a、配置MAVEN_HOME : D:\apache-maven-3.6.3

  b、配置path:%MAVEN_HOME%\bin

命令行窗口下用 mvn -v 驗證安裝是否成功。

以上三步就已經成功安裝了maven,但為了讓你的maven使用經歷更加暢快,你還需要做出以下一些小修改。

(1)增加Maven鏡像

  Maven 倉庫默認在國外, 國內使用難免很慢,我們可以更換為阿里雲的倉庫。

  Maven安裝目錄下,找 conf ----->settings.xml,在 mirrors 標簽下加入下面內容

<mirror>
         <!--This sends everything else to /public -->
         <id>nexus-aliyun</id>
         <mirrorOf>*</mirrorOf>
         <name>Nexus aliyun</name>
         <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

 

(2)修改本地倉庫位置

  Maven默認本地倉庫地址在C盤,隨着項目的增加,這無疑會使得C盤變的臃腫,可以修改C盤的路徑。

  Maven安裝目錄下,找 conf ----->settings.xml,修改 localRepository 標簽中的地址到你開心的位置。

 <localRepository>F:/soft/MVN_repository</localRepository>

(3)修改IDE的配置,使本地倉庫生效

  Eclipse:Windows---->Preferences---->Maven---->User Settings---->Global Settings選擇你之前配置的settings.xml

  Idea:File---->Other Settings---->Settings for new projects---->Maven---->Maven home directory選擇Maven的安裝目錄,例如  D:\apache-maven-3.6.3

     File---->Other Settings---->Settings for new projects---->Maven---->User settings file選擇你之前配置的settings.xml

      

三、Maven常用命令

安裝完成后,不要先着急使用,還有一些知識需要你進行了解,以便於你更好的使用Maven。

Maven生命周期總的來分為clean,build,site三大部分,其中build又依次包括validate--->compile--->Test--->package--->verify--->install--->deploy,本篇文章比較偏向於實踐,具體的生命周期的知識筆者不再贅述(生命周期的知識比較偏理論,但也挺重要的,還是希望大家自行了解下,https://www.runoob.com/maven/maven-build-life-cycle.html),生命周期的一些階段對應着Maven的一些常用命令,

命令 描述
mvn clean 刪除target目錄(刪除編譯文件的目錄)
mvn compile 只編譯main目錄中的java文件
mvn test 執行test目錄下的測試用例
mvn package 將編譯后的代碼打包成可分發格式的文件,比如JAR、WAR或者EAR文件。
mvn install 安裝項目包到本地倉庫,這樣項目包可以用作其他本地項目的依賴

值得注意的是,每一個命令執行時,該命令之前以及包括該命令在內的所有命令都會被執行,比如執行了mvn install,前邊的五條命令也都會被執行。

四、POM文件

為了方便理解,先對常見的pom文件結構進行講解,掌握了下邊的文件結構,基本上你就可以關掉本篇博文,使用maven進行開發了,但如果你對此並不滿足,可以繼續向下看。

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!--聲明項目描述符遵循哪一個POM模型版本。模型本身的版本很少改變,
  雖然如此,但它仍然是必不可少的,這是為了當Maven引入了新的特性或者其他模型變更的時候,確保穩定性。 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者組織的唯一標志,並且配置時生成的路徑也是由此生成,
   如com.liu.learning,maven會將該項目打成的jar包放本地倉庫下的:/com/liu/learning 目錄下下-->
    <groupId>com.liu.learning</groupId>
    <!-- 項目的唯一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 -->
    <artifactId>HelloWorld01</artifactId>
    <!-- 版本號 -->
    <version>0.0.1-SNAPSHOT</version>
    <!--項目的名稱, Maven產生的文檔用 -->
    <name>HelloWorld01</name>
    <!--項目產生的構件類型,例如jar、war、ear、pom。 -->
    <packaging>jar</packaging>
    <!--項目描述 -->
    <description>hello world</description><!-- 統一JDK版本 -->
    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles><dependencies>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- jar包的作用范圍,相關知識會摘出來單獨講解 -->
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--  下邊還是配置遠程倉庫鏡像  -->
    <!--  如果你不想在conf.xml配置國內鏡像,又想高速下載jar包時,那你就只能每次都手動加入如下配置  -->
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <!--如果你只配置了repositories,你會發現在下載依賴時,一部分從阿里雲下載,
    一部分(插件部分)還是從默認的倉庫下載,所以你還要配置插件的遠程倉庫地址,
    那么這個插件又是什么東西呢,可以看下方圖片粗略了解下-->
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>

 

 

 

 

五、jar包的作用范圍scope

常用的三個分別是compile,test,provided 作用范圍如下表:

階段 \ scope compile test provided
編譯 ×
測試
部署(運行) × ×

1、compile

  缺省值,如果不顯式聲明默認為compile,適用於所有階段,會隨着項目一起發布。

2、test

  jar包只在測試階段需要,常見的jar比如說junit

3、provided

  jar包只在編譯和測試時需要,這種比較少見,比如說servlet-api.jar,編譯和測試時需要servlet 環境,但運行時由tomcat提供servlet環境,就不需要servlet-api.jar了

六、Maven依賴與依賴排除

1、Maven自動引入依賴

假如說我們需要用到A.jar,但是A.jar中又用到了B.jar,Maven會自動幫我們引入B.jar,最常見的例子就是spring-context.jar 了,大家可以自行嘗試將下邊依賴引入,Maven不僅會將spring-context.jar引入,還會將spring-aop.jar,spring-beans.jar等其他jar包一並引入。

 <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>5.2.6.RELEASE</version>
 </dependency>

 2、依賴排除的兩種方案

但如果我們確實用不到其他jar但Maven又幫我們引入了,那該怎們辦呢?

<!-- 方法一 -->
 <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>5.2.6.RELEASE</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.springframework</groupId>
                     <artifactId>spring-core</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>org.springframework</groupId>
                     <artifactId>spring-beans</artifactId>
                 </exclusion>
                 <exclusion>
                     <groupId>org.springframework</groupId>
                     <artifactId>spring-aop</artifactId>
                 </exclusion>
             </exclusions>
 </dependency><!-- 方法二 --><dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
             <version>5.2.6.RELEASE</version>
             <exclusions>
                 <exclusion>
                     <groupId>*</groupId>
                     <artifactId>*</artifactId>
                 </exclusion>
             </exclusions>
 </dependency>

 

七、Maven依賴傳遞與依賴原則

1、依賴傳遞

在數學上,若A依賴於B,B依賴於C,那么A依賴於C成立,但在Maven中還需要添加一個條件,要使 A.jar依賴於C.jar,當且僅當 B.jar 依賴於C.jar的范圍是compile

創建maven項目A,B,其中B中引入junit.jar,然后將B用mvn install安裝到本地倉庫,再將B引入到A,改變junit的scope觀察A中是否引入junit。

實驗過程如上,讀者可自行實驗。

2、依賴原則

我們再來看下邊三個案例,

(1)同一POM中引入同一jar包的不同版本時(不推薦這樣做),會使用哪個版本呢?

(2)項目A->B,B->junit.jar(scope為compile),同時A->junit.jar,那么A中又會使用哪個jar呢?

(3)項目A依賴B和C,B和C都依賴了不同版本的junit.jar(scope為compile),那么A中會使用哪個jar呢?

前兩個很好猜,第一個pom文件寫在后邊的jar會覆蓋前邊的jar。第二個會選擇離自己最近的jar,也就是A中自己的jar。第三個同時也遵循 離自己最近的原則,但是兩者距離一樣,那怎么辦呢?POM文件中對B和C的依賴聲明總有先后順序吧,那就采用先聲明那個中的jar。

我們拋去第一個案例(開發中嚴禁這樣做),來總結下規則:

(1)路徑最近者優先。

(2)第一聲明者優先。

八、Maven依賴繼承

1、父項目

<!-- 第一步:父項目必須聲明為pom -->
 <packaging>pom</packaging>

<!-- 第二步:dependencies外層套上dependencyManagement --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>

2、子項目

<!-- 第一步:引入父項目的坐標 -->
 <parent>
         <groupId>com.liu.learing</groupId>
         <artifactId>parent</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <!-- 當前工程的Pom.xml到父工程的Pom.xml之間的 相對路徑   默認值為  ../pom.xml--> 
         <!-- 父項目的pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../pom.xml。Maven首先在
  構建當前項目的地方尋找父項 目的pom,其次在文件系統的這個位置(relativePath位置),然后在本地倉庫,最后
  在遠程倉庫尋找父項目的pom。
--> <relativePath>../parent/pom.xml</relativePath> </parent><!-- 第二步:寫出要用到父項目的jar包名稱,不用寫版本號 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>

 

九、項目聚合

Maven項目能夠識別自身和本地倉庫中的項目,如果項目A依賴項目B,必須要把項目B進行打包安裝放入本地倉庫,然后再在項目A中引入才能使用。但是如果項目A依賴很多個其他項目,這樣一一打包安裝就比較麻煩了,這就引出了“聚合”。

 <!-- 第一步:總項目必須聲明為pom -->
 <packaging>pom</packaging><!-- 
 第二步:總項目引入子項目地址,子項目 相對 總項目pom文件 的 相對地址(就是以總項目的pom文件為起點,去找子項目)
  注意:這里是 子項目 而不是 子項目的pom文件相對總項目pom文件 ,這一點和依賴繼承不同
 --> 
 <modules>
         <module>../one</module>
         <module>../two</module>
 </modules>

 <!-- 然后子項目就可以正常互相引用,而省去了install的步驟 -->

 

十、統一管理版本

有時候開發項目過程會遇到版本號統一升級的問題,例如junit版本從3.0版本升級成4.12版 這個時候有兩個處理辦法

1、原始方案

在pom文件里統一 ctrl+f 搜索替換一下。

2、高級方案

使用pom里的properties標簽,自定義一個 xxx 標簽,標簽內就是版本號,在需要使用的地方使用 ${xxx} 靈活取出上面定義的值,這個樣子就不用那樣修改多個地方啦!

  <properties>
         <junit>4.12</junit>
  </properties><dependencies>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit}</version>
             <scope>compile</scope>
         </dependency>
     </dependencies>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM