Java開發中Maven使用的總結

1. 初衷

  相信每一個java開發人員對maven都不陌生,它和git,svn,idea同樣,伴隨着咱們開發的每一分鐘。
但你在大多數時候,只是在使用它,你真的認識它,瞭解它,熟悉它嗎?
今天我來分享一點,我在項目中使用maven總結出的東西java

2. 倉庫

  倉庫,是用來存放東西的地方,maven倉庫也是同樣,用來存放咱們會用到的一些構件
  Maven 倉庫能幫助咱們管理構件(主要是JAR),它就是放置全部JAR文件(WAR,ZIP,POM等等)的地方。
Maven 倉庫有兩種類型:git

  • 本地(local)
  • 遠程(remote)(中央(central)也算一種遠程倉庫)

2.1 本地倉庫

   運行 Maven 的時候,Maven 所須要的任何構件都是直接從本地倉庫獲取的。若是本地倉庫沒有,它會首先嚐試從遠程倉庫下載構件至本地倉庫,而後再使用本地倉庫的構件。web

   在本地倉庫中已存在的構件,包括從遠程倉庫獲取的以及本地項目install進去的項目,都是最早優先級被被項目使用的spring

   本地倉庫默認路徑爲 本機用戶下: .m2/respository/ 文件夾,也能夠在settings.xml中指定本地倉庫路徑apache

<localRepository>/path/to/local/repo</localRepository>

2.2 遠程倉庫

2.2.1 中央倉庫(central)

  中央倉庫是maven最核心的倉庫,也是默認使用的倉庫。中央倉庫由 Maven 社區提供,包含了絕大多數流行的開源Java構件,以及源碼、做者信息、SCM、信息、許可證信息等。通常來講,簡單的Java項目依賴的構件均可以在這裏下載到。
中央倉庫Nexustomcat

2.2.2 發佈項目到maven中央倉庫

  後面找時間單獨寫一篇發佈日記網絡

2.2.3 自定義倉庫,私服

  因爲中央倉庫的開源等條件限制,不少構件並不會發佈到中央倉庫,不少組織或單位就定製了本身的倉庫,包含了所須要的代碼庫或者其餘工程中用到的構件。mvc

2.3 遠程倉庫使用與配置

emsp; 在平常項目開發中,不一樣項目,可能須要用到不一樣的遠程倉庫來下載構件,咱們一般使用一下兩種方式來維護遠程倉庫地址:app

  • 在settings.xml中定義倉庫
  • 在項目pom.xml中指定倉庫
2.3.1 在settings.xml中定義倉庫

emsp; 默認狀況下,遠程倉庫使用的就是中央倉庫,但受限於國內網絡環境,咱們一般使用國內鏡像倉庫,好比阿里雲Maven倉庫。maven

使用<mirror></mirror>標籤來指定要使用的倉庫
<mirrors>
    <mirror>
      <id>aliyunmaven</id>
      <name>aliyun maven</name>
      <url>https://maven.aliyun.com/repository/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
屬性 描述
id 鏡像標識(惟一)
name 鏡像描述
url 倉庫地址
mirrorOf 倉庫匹配模式
mirrorOf 倉庫匹配模式
屬性 描述
central 指向中央倉庫的構件匹配到本倉庫
* 匹配全部構件到本倉庫
repo1,repo2 匹配倉庫repo1和repo2,使用逗號分隔多個遠程倉庫
*,!repo1: 匹配除repo1外全部遠程倉庫,使用感嘆號將倉庫從匹配中排除

  須要注意的是,因爲鏡像倉庫徹底屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者中止服務的時候,Maven仍將沒法訪問被鏡像倉庫,於是將沒法下載構件。

2.3.2 經常使用遠程倉庫
  1. 阿里中央倉庫
<repository>  
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
  1. camunda.com 中央倉庫
<repository>  
    <id>activiti-repos2</id>  
    <name>Activiti Repository 2</name>  
    <url>https://app.camunda.com/nexus/content/groups/public</url>  
</repository>
  1. spring.io 中央倉庫
<repository>  
    <id>springsource-repos</id>  
    <name>SpringSource Repository</name>  
    <url>http://repo.spring.io/release/</url>  
</repository>
  1. maven.apache.org 中央倉庫
<repository>  
    <id>central-repos</id>  
    <name>Central Repository</name>  
    <url>http://repo.maven.apache.org/maven2</url>  
</repository>
  1. maven.org 中央倉庫
<repository>  
    <id>central-repos1</id>  
    <name>Central Repository 2</name>  
    <url>http://repo1.maven.org/maven2/</url>  
</repository>
  1. alfresco.com 中央倉庫
<repository>  
    <id>activiti-repos</id>  
    <name>Activiti Repository</name>  
    <url>https://maven.alfresco.com/nexus/content/groups/public</url>  
</repository>
2.3.3 pom.xml中定義倉庫

  經過<repositories></repositories>配置庫,這樣配置的庫僅適用於當前項目。

  repositorie的主要參數

屬性 描述
id 庫的ID
url 庫的URL
releases 是否啓用releases   Release版本則表明穩定的版本,發行版本
snapshots 是否啓用snapshots   Snapshot版本表明不穩定、尚處於開發中的版本,快照版本

  樣例:

<repositories>
    <repository>
        <id>aliyunmaven</id>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

2.4 配置倉庫認證信息

  項目在向倉庫推送構件或者拉取構件時,有些倉庫須要認證,故須要爲指定倉庫id配置 認證信息
  在settings.xml中配置認證信息

<servers>
    <server>
      <id>ossrh</id>
      <username>qwerwer</username>
      <password>asdfasdfasdfe2234dsed+23sdfsfaseafd</password>
    </server>
</servers>

3. maven中的父子關係

  在一些較大的項目中,咱們一般須要將項目合理的拆分紅多個不一樣的子模塊,以便於統一的配置管理,代碼複用,方便程序的維護與開發。
  父模塊必須使用 pom 的方式打包以下:

<packaging>pom</packaging>

  在父模塊中定義要管理的子模塊

<modules>
   <module>childA</module>
   <module>childB</module>
</modules>

3.1 pom.xml 中的 dependencymanagement 和 dependencies

  在maven父子關係中,子項目會集成父類大部分配置的。對於咱們在項目中須要使用的構件,咱們可使用兩種方式來引入:

  • 在父類 dependencies 中定義
  • 在父類 dependencymanagement 中定義

  由於繼承關係,兩種方式引入的構件,均可以用來在子項目中使用,但用法有區別,也有各自的優點。

3.1.1 dependencies

  使用dependencies在父pom中引入構件,此種方式引入的jar能夠在全部子模塊中使用,使用相同配置,並不須要從新引用,適用於共用構件,舉個

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
</dependencies>
3.1.2 dependencymanagement

  使用dependencymanagement在父pom中引入構件,此種方式引入的jar,若子模塊須要使用,則須要從新在<dependencies>標籤中使用,父類提供統一的版本控制,舉個

  • 父pom.xml
<dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
</dependencies>
</dependencyManagement>
  • 子pom.xml
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

4. maven中構件的版本控制

  使用maven中,最讓咱們頭疼的就是jar包的版本,構件以前相互嵌套,不一樣版本相互依賴,不相兼容,會致使咱們在開發中遇到不少奇奇怪怪的問題。
瞭解版本控制,能夠幫咱們在遇到麻煩時,快速定位問題。

  Maven使用groupId(通常是組織的域名倒寫)+ artifactId(庫自己的名稱) + version(版本)來定義座標,經過xml來作配置文件。

  Maven我會在後面的筆記中,手把手教您一步步上傳本身的項目到maven中央倉庫

4.1 maven傳遞依賴

  Maven 在 pom.xml 中引入jar包,當Maven解析該依賴時,還須要引入該依賴pom中所依賴的構件以及構件中依賴的構件。這必然會形成同一構件的不用版本同時出如今項目中。

4.1.1 maven的解決方案爲:
  • 最短路徑原則
A -> B -> C -> D(V1)
F -> G -> D(V2)

  若某項目想使用構件D,並存在以上依賴關係時,優先使用D(V2),其暴露深度更短。

  • 優先原則

  若是A-B-X(1.0) ,A-C-X(2.0) 這樣的路徑長度同樣怎麼辦呢?這樣的狀況下,maven會根據pom文件聲明的順序加載,若是先聲明瞭B,後聲明瞭C,那就最後的依賴就會是X(1.0)。

  • 覆蓋優先原則

  子pom內聲明的優先於父pom中的依賴。

4.1.2 自定義過濾依賴

  咱們在項目中,可使用 <exclusions>標籤來過濾掉不須要的依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

4.2 maven依賴的版本管理

4.2.1 在 <properties></properties>標籤中定義版本號

舉個

<properties>
    <spring-framework-version>4.3.7.REALEASE</spring-framework-version>
</properties>

  在引入依賴時使用:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring-framework-version}</version>
  <scope>compile</scope>
</dependency>

未完待續





更多好玩好看的內容,歡迎到個人博客交流,共同進步        WaterMin

喜歡聽相聲的朋友,也能夠來個人 YouTube,來聽郭老師的相聲    秋釀

相關文章
相關標籤/搜索