超全面Maven

Maven

主要內容

Maven的簡介

簡介

​ Maven【[ˈmevən]】這個詞能夠翻譯爲"專家","內行"。 做爲Apache組織中的一個頗爲成功的開源項目,Maven主要服務於基於java平臺的項目構建,依賴管理和項目信息管理。 html

​ 不管是小型的開源類庫項目,仍是大型的企業級應用; 不管是傳統的瀑布式開發,仍是流行的敏捷開發,Maven都能大顯身手。java

項目構建

​ 無論你是否意識到,構建(build)是每一位程序員天天都在作的工做。早上來到公司,咱們作的第一件事就是從源碼庫簽出最新的代碼,而後進行單元測試,若是測試失敗,會找相關的同事一塊兒調試,修復錯誤代碼。 接着回到本身的工做上來,編寫本身的單元測試及產品代碼。程序員

​ 仔細總結一下,咱們會發現,除了編寫源代碼,咱們天天有至關一部分時間花在了編譯,運行單元測試,生成文檔,打包和部署等繁瑣且不起眼的工做上,這就是構建。 若是咱們如今還手工這樣作,那成本也過高了,因而有人用軟件的方法讓這一系列工做徹底自動化,使得軟件的構建能夠像全自動流水線同樣,只須要一條簡單的命令,全部繁瑣的步驟都可以自動完成,很快就能獲得最終結果。web

項目構建工具

Ant構建spring

​ 最先的構建工具,基於IDE, 大概是2000年有的,當時是最流行java構建工具,不過它的XML腳本編寫格式讓XML文件特別大。對工程構建過程當中的過程控制特別好shell

Maven【JAVA】數據庫

​ 項目對象模型,經過其描述信息來管理項目的構建,報告和文檔的軟件項目管理工具。它填補了Ant缺點,Maven第一次支持了從網絡上下載的功能,仍然採用xml做爲配置文件格式。Maven專一的是依賴管理,使用Java編寫。apache

**Gradle**

​ 屬於結合以上兩個的優勢,它繼承了Ant的靈活和Maven的生命週期管理,它最後被google做爲了Android御用管理工具。它最大的區別是不用XML做爲配置文件格式,採用了DSL格式,使得腳本更加簡潔。api

​ 目前市面上Ant比較老,因此通常是一些比較傳統的軟件企業公司使用,Maven使用Java編寫, 是當下大多數互聯網公司會使用的一個構建工具, 中文文檔也比較齊全, gradle是用groovy編寫,目前比較新型的構建工具一些初創互聯網公司會使用,之後會有很大的使用空間。瀏覽器

image

Maven的四大特性

依賴管理系統

​ Maven爲Java世界引入了一個新的依賴管理系統jar包管理 jar 升級時修改配置文件便可。在Java世界中,能夠用groupId、artifactId、version組成的Coordination(座標)惟一標識一個依賴。

​ 任何基於Maven構建的項目自身也必須定義這三項屬性,生成的包能夠是Jar包,也能夠是war包或者jar包。一個典型的依賴引用以下所示:

<dependency>
    <groupId>javax.servlet</groupId>   com.baidu
    <artifactId>javax.servlet-api</artifactId>  ueditor echarts
    <version>3.1.0</version>
</dependency>

座標屬性的理解

​ Maven座標爲各類組件引入了秩序,任何一個組件都必須明肯定義本身的座標。

groupId

​ 定義當前Maven項目隸屬的實際項目-公司名稱。(jar包所在倉庫路徑) 因爲Maven中模塊的概念,所以一個實際項目每每會被劃分爲不少模塊。 好比spring是一個實際項目,其對應的Maven模塊會有不少,如spring-core,spring-webmvc等。

artifactId

​ 該元素定義實際項目中的一個Maven模塊-項目名, 推薦的作法是使用實際項目名稱做爲artifactId的前綴。 好比: spring-bean、 spring-webmvc等。

version

​ 該元素定義Maven項目當前所處的版本。

多模塊構建

​ 項目複查時 dao service controller 層分離將一個項目分解爲多個模塊已是很通用的一種方式。

​ 在Maven中須要定義一個parent POM做爲一組module的聚合POM。在該POM中可使用 <modules> 標籤來定義一組子模塊。parent POM不會有什麼實際構建產出。而parent POM中的build配置以及依賴配置都會自動繼承給子module。

一致的項目結構

​ Ant時代你們建立Java項目目錄時比較隨意,而後經過Ant配置指定哪些屬於source,那些屬於testSource等。而Maven在設計之初的理念就是Conversion over configuration(約定大於配置)。其制定了一套項目目錄結構做爲標準的Java項目結構,解決不一樣ide 帶來的文件目錄不一致問題。

一致的構建模型和插件機制

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.25</version>
    <configuration>
         <scanIntervalSeconds>10</scanIntervalSeconds>
         <contextPath>/test</contextPath>
    </configuration>
</plugin>

Maven的安裝配置和目錄結構

Maven的安裝配置

檢查JDK的版本

​ JDK版本1.7及以上版本

下載Maven

​ 下載地址:http://maven.apache.org/downl...

配置Maven環境變量

​ 解壓後把Maven的根目錄配置到系統環境變量中MAVEN_HOME,將bin目錄配置到path變量中。

​ 注:maven解壓後存放的目錄不要包含中文和空格

檢查Maven是否安裝成功

​ 打開dos窗口,執行 mvn -v[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aNSEjOD4-1607568090193)(/maven_1.png)]

認識Maven目錄結構

Maven項目目錄結構[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dcKONxu1-1607568090199)(/maven_2.png)]

<font color="red">任務:手動建立一個Maven項目,並編譯運行成功!</font>

建立一個文件夾做爲項目的根目錄

在根目錄中建立一個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>com.xxxx</groupId>
  <artifactId>maven01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>maven01</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>    
  </dependencies>
  
</project>

Ps:標籤訂義解釋

根目錄下的第一個子元素 ModelVersion指定當前Pom模型的版本,對於Maven3來講,它只能是4.0.0 。指定了當前Maven模型的版本號,對於Maven2和Maven3來講,它只能是4.0.0

groupId定義了項目屬於哪一個組, 這個組每每和項目所在的組織和公司存在關聯。 
好比: com.xxxx

artifactId 定義了當前Maven項目在組中惟一的ID。

Version  X.X.X-里程碑
好比:1.0.0-SNAPSHOT     
第一個X 大版本 有重大變革
第二個X 小版本  修復bug,增長功能
第三個X 更新

里程碑版本: 
SNAPSHOT (快照,開發版)
alpha(內部測試)
beta(公開測試)
Release | RC( 發佈版)
GA(正常版本)

使用name標籤聲明一個對於用戶更爲友好的項目名稱,雖然不是必須的,但仍是推薦爲每一個Pom聲明name,以方便信息交流。

編寫主函數

package com.xxxx.demo;
public class Hello{
    public static void main(String[] args) {
        System.out.println("hello maven");
    }
}

cmd 下編譯並運行

​ cmd下面,進入項目的根目錄

​ 1. 編譯java文件

​ mvn compile

​ 2. 執行main 方法

​ mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"

​ [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XML5lTYt-1607568090209)(/maven_3.png)]

​ <font color="red">注:第一次下載會比較慢,要修改maven解壓以後的conf目錄下的settings.xml。</font>

1.1.修改默認倉庫位置
打開maven目錄 -> conf -> settings.xml
添加倉庫位置配置
<localRepository>F:/m2/repository</localRepository>
注:倉庫位置改成本身本機的指定目錄,"/"不要寫反

1.2.更換阿里鏡像,加快依賴下載
<mirror>  
      <id>nexus-aliyun</id>  
      <mirrorOf>central</mirrorOf>    
      <name>Nexus aliyun</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

若是編譯不成功,可能出現的問題

1. 不是使用管理員權限執行dos命令
2. JDK環境配置有問題,重裝JDK
3. 代碼編寫時,類裏面沒設置包名(若是編譯時類沒加包名,執行時也不須要加包名)

Maven命令

​ 做爲開發利器的maven,爲咱們提供了十分豐富的命令,瞭解maven的命令行操做並熟練運用常見的maven命令仍是十分必要的,即便譬如IDEA等工具給我提供了圖形界面化工具,但其底層仍是依靠maven命令來驅動的。

Maven的命令格式以下:

mvn [plugin-name]:[goal-name]

命令表明的含義:執行plugin-name插件的goal-name目標

經常使用命令

命令 描述
mvn –version 顯示版本信息
mvn clean 清理項目生產的臨時文件,通常是模塊下的target目錄
mvn compile 編譯源代碼,通常編譯模塊下的src/main/java目錄
mvn package 項目打包工具,會在模塊下的target目錄生成jar或war等文件
mvn test 測試命令,或執行src/test/java/下junit的測試用例.
mvn install 將打包的jar/war文件複製到你的本地倉庫中,供其餘模塊使用
mvn deploy 將打包的文件發佈到遠程參考,提供其餘人員進行下載依賴
mvn site 生成項目相關信息的網站
mvn eclipse:eclipse 將項目轉化爲Eclipse項目
mvn dependency:tree 打印出項目的整個依賴樹
mvn archetype:generate 建立Maven的普通java項目
mvn tomcat7:run 在tomcat容器中運行web應用
mvn jetty:run 調用 Jetty 插件的 Run 目標在 Jetty Servlet 容器中啓動 web 應用
注意:運行maven命令的時候,首先須要定位到maven項目的目錄,也就是項目的pom.xml文件所在的目錄。不然,必以經過參數來指定項目的目錄。

命令參數

​ 上面列舉的只是比較通用的命令,其實不少命令均可以攜帶參數以執行更精準的任務。

-D 傳入屬性參數

例如:

`mvn package -Dmaven.test.skip=true`

​ 以-D開頭,將maven.test.skip的值設爲true,就是告訴maven打包的時候跳過單元測試。同理,mvn deploy-Dmaven.test.skip=true表明部署項目並跳過單元測試。

-P 使用指定的Profile配置

​ 好比項目開發須要有多個環境,通常爲開發,測試,預發,正式4個環境,在pom.xml中的配置以下:

<profiles>
      <profile>
             <id>dev</id>
             <properties>
                    <env>dev</env>
             </properties>
             <activation>
                    <activeByDefault>true</activeByDefault>
             </activation>
      </profile>
      <profile>
             <id>qa</id>
             <properties>
                    <env>qa</env>
             </properties>
      </profile>
      <profile>
             <id>pre</id>
             <properties>
                    <env>pre</env>
             </properties>
      </profile>
      <profile>
             <id>prod</id>
             <properties>
                    <env>prod</env>
             </properties>
      </profile>
</profiles>
 
......
 
<build>
      <filters>
             <filter>config/${env}.properties</filter>
      </filters>
      <resources>
             <resource>
                    <directory>src/main/resources</directory>
                    <filtering>true</filtering>
             </resource>
      </resources>
 
      ......
 
</build>

profiles定義了各個環境的變量idfilters中定義了變量配置文件的地址,其中地址中的環境變量就是上面profile中定義的值,resources中是定義哪些目錄下的文件會被配置文件中定義的變量替換。

​ 經過maven能夠實現按不一樣環境進行打包部署,例如:

mvn package -Pdev -Dmaven.test.skip=true

​ 表示打包本地環境,並跳過單元測試

IDEA編輯器集成Maven環境

設置Maven版本

選擇 "File" —> "Other Settings" —> "Settings for New Projects..." —> 搜索 "Maven"

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-33D17Plc-1607568090216)(/maven_4.png)]

選擇下載好的maven版本(目錄選到bin目錄的上一級目錄)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gvwtpJdR-1607568090220)(/maven_5.png)]

設置settings.xml文件

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-y0mg3hEq-1607568090224)(/maven_6.png)]

設置好以後,選擇 "Apply" 或者 "OK"

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ENIqjWny-1607568090227)(/maven_7.png)]

Maven項目的建立

建立 Java項目

新建項目

  1. 選擇 "File" —> "New" —> "Project"

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-V38Oa399-1607568090229)(/maven_8.png)]

  2. 選擇"Maven",設置JDK版本,選擇maven項目的模板

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vEdndD6s-1607568090231)(/maven_9.png)]

  3. 設置項目的 GroupId 和 ArtifactId

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wkb2lKij-1607568090234)(/maven_10.png)]

  4. 檢查Maven環境,選擇 "Next"

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nvpewVnE-1607568090237)(/maven_11.png)]

  5. 檢查項目名和工做空間,選擇 "Finish"

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZGMyoRJW-1607568090240)(/maven_12.png)]

  6. 等待項目建立,下載資源,建立完成後目錄結構以下

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G6Phzzw9-1607568090242)(/maven_13.png)]

    <font color="red">注:右下角彈出的提示框,選擇 "Enable Auto-Import"(Maven啓動自動導入)</font>

編譯項目

  1. 點擊右上角的 "Add Configurations ",打開 "Run/Debug Configurations" 窗口[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6qO237IW-1607568090244)(/maven_14.png)]
  2. 點擊左上角的 "+" 號,選擇 "Maven"

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HtQf7bRD-1607568090246)(/maven_15.png)]

  3. 設置編譯項目的命令

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-odFlHniH-1607568090248)(/maven_16.png)]

  4. 執行編譯命令,兩個圖標分別表明"普通模式"和"調試模式"[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4c8Ezq3j-1607568090261)(/maven_17.png)]
  5. 編譯成功

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iJlEsjRH-1607568090263)(/maven_18.png)]

建立 Web項目

建立項目

  1. 建立Web項目與建立Java項目步驟基本一致,區別在於選擇 Maven模板(web項目選擇webapp),如圖:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-88cYy983-1607568090265)(/maven_19.png)]

    注:其餘步驟與建立普通的Java項目相同。

  2. 項目目錄結構以下:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ND0WhxQN-1607568090267)(/maven_28.png)]

啓動項目

修改 JDK 的版本
<!-- JDN的版本修改成1.8 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
設置單元測試的版本
<!-- junit的版本修改成4.12 -->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
刪除pluginManagement標籤
<!-- 將這個標籤及標籤中的內容所有刪除 -->
<pluginManagement>
...
</pluginManagement>
添加web部署的插件

​ 在 build 標籤中添加 plugins 標籤

  1. Jetty插件

    <!-- 設置在plugins標籤中 -->
    <plugin>
       <groupId>org.mortbay.jetty</groupId>
       <artifactId>maven-jetty-plugin</artifactId>
       <version>6.1.25</version>
       <configuration>
          <!-- 熱部署,每10秒掃描一次 -->
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <!-- 可指定當前項目的站點名 -->
          <contextPath>/test</contextPath>                 
          <connectors>
              <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                  <port>9090</port> <!-- 設置啓動的端口號 -->
              </connector>
          </connectors>
       </configuration>
    </plugin>
  2. Tomcat插件

    <!-- 設置在plugins標籤中 -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
            <port>8081</port> <!-- 啓動端口 默認:8080 -->
            <path>/test</path> <!-- 項目的站點名,即對外訪問路徑 -->
            <uriEncoding>UTF-8</uriEncoding> <!-- 字符集編碼 默認:ISO-8859-1 -->
            <server>tomcat7</server> <!-- 服務器名稱 -->
        </configuration>
    </plugin>
啓動項目
  1. 點擊右上角的 "Add Configurations ",打開 "Run/Debug Configurations" 窗口[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uyJzOO63-1607568090269)(/maven_14.png)]
  2. 點擊左上角的 "+" 號,選擇 "Maven"

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-bO9adwGZ-1607568090273)(/maven_15.png)]

  3. Jetty插件配置

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-schUkQXA-1607568090275)(/maven_20.png)]

    也能夠輸入命令指定端口啓動

    jetty:run -Djetty.port=9090  # 須要將插件配置中的port標籤去掉

    點擊啓動圖標,啓動服務[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1vjfXZRN-1607568090277)(/maven_21.png)]

    啓動成功[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qd96sTFm-1607568090280)(/maven_22.png)]

    瀏覽器訪問效果[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-i7w8K5of-1607568090281)(/maven_23.png)]

  4. Tomcat插件配置

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-76q2tDPn-1607568090283)(/maven_24.png)]

    啓動方式如上,啓動成功[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yTE4UGJo-1607568090285)(/maven_25.png)]

    瀏覽器訪問 http://localhost:8080/test [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fnKZMdih-1607568090287)(/maven_26.png)]

Maven倉庫的基本概念

​ 當第一次運行Maven命令的時候, 你須要Internet連接, 由於它須要從網上下載一些文件。 那麼它從哪裏下載呢? 它是從Maven默認的遠程庫下載的。 這個遠程倉庫有Maven的核心插件和可供下載的jar文件。

​ 對於Maven來講, 倉庫只分爲兩類: 本地倉庫和遠程倉庫

​ 當Maven根據座標尋找構件的時候,它首先會查看本地倉庫,若是本地倉庫存在,則直接使用; 若是本地沒有,Maven就會去遠程倉庫查找,發現須要的構件以後,下載到本地倉庫再使用。 若是本地倉庫和遠程倉庫都沒有,Maven就會報錯。

​ 遠程倉庫分爲三種: 中央倉庫,私服, 其餘公共庫。

​ 中央倉庫是默認配置下,Maven下載jar包的地方。

​ 私服是另外一種特殊的遠程倉庫,爲了節省帶寬和時間,應該在局域網內架設一個私有的倉庫服務器,用其代理全部外部的遠程倉庫。 內部的項目還能部署到私服上供其餘項目使用。

​ 通常來講,在Maven項目目錄下,沒有諸如lib/這樣用來存放依賴文件的目錄。 當Maven在執行編譯或測試時,若是須要使用依賴文件,它老是基於座標使用本地倉庫的依賴文件。

​ 默認狀況下, 每一個用戶在本身的用戶目錄下都有一個路徑名爲.m2/repository/的倉庫目錄。 有時候,由於某些緣由(好比c盤空間不足),須要修改本地倉庫目錄地址。

​ 對於倉庫路徑的修改,能夠經過maven 配置文件conf 目錄下settings.xml來指定倉庫路徑

<!-- 設置到指定目錄中,路徑的斜杆不要寫反 -->
<settings>
    <localRepository>D:/m2/repository</localRepository>
</settings>

中央倉庫

​ 因爲原始的本地倉庫是空的,maven必須知道至少一個可用的遠程倉庫,才能執行maven命令的時候下載到須要的構件。中央倉庫就是這樣一個默認的遠程倉庫。

​ maven-model-builder-3.3.9.jar maven自動的 jar 中包含了一個 超級POM。定義了默認中央倉庫的位置。

中央倉庫包含了2000多個開源項目,接收天天1億次以上的訪問。

私服

​ 私服是一種特殊的遠程倉庫,它是架設在局域網內的倉庫服務, 私服代理廣域網上的遠程倉庫,供局域網內的maven用戶使用。 當maven須要下載構件時, 它去私服當中找,若是私服沒有, 則從外部遠程倉庫下載,並緩存在私服上, 再爲maven提供。

​ 此外,一些沒法從外部倉庫下載的構件也能從本地上傳到私服提供局域網中其餘人使用

配置方式項目pom.xml 配置

<repositories>
    <repository>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <id>public</id>
        <name>Public Repositories</name>
        <url>http://192.168.0.96:8081/content/groups/public/</url>
    </repository>
    <repository>
        <id>getui-nexus</id>                        <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
    </repository>
</repositories>

公司內部應該創建私服:

  • 節省本身的外網帶寬
  • 加速maven構建
  • 部署第三方控件
  • 提升穩定性
  • 下降中央倉庫的負荷

其餘公共庫

經常使用的阿里雲倉庫配置

<mirror>  
    <id>nexus-aliyun</id>  
    <mirrorOf>central</mirrorOf>    
    <name>Nexus aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

Maven環境下構建多模塊項目

​ 使用maven 提供的多模塊構建的特性完成maven 環境下多個模塊的項目的管理與構建。

這裏以四個模塊爲例來搭建項目,以達到通俗易懂的初衷 

模塊 maven_parent —– 基模塊,就是常說的parent (pom)

模塊 maven_dao —–  數據庫的訪問層,例如jdbc操做(jar)

模塊 maven_service —– 項目的業務邏輯層 (jar)

模塊 maven_controller —– 用來接收請求,響應數據 (war)

建立 maven_parent 項目

  1. 選擇 File —> Settings —> Project[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CDqADY1K-1607568090289)(/maven_37.png)]
  2. 設置 GroupId 和 ArtifactId[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wlhqne9k-1607568090291)(/maven_38.png)]
  3. 設置項目名稱及工做空間[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WYiHs5ee-1607568090293)(/maven_39.png)]

建立 maven_dao 模塊

  1. 選擇項目maven_parent,右鍵選擇 New ,選擇Module[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5LSYORnC-1607568090296)(/maven_40.png)]
  2. 選擇Maven項目的模板(普通 Java 項目)[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-A8jH3rGZ-1607568090297)(/maven_41.png)]
  3. 設置子模塊的的 ArtifactId[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zOKc012S-1607568090299)(/maven_42.png)]
  4. 設置Maven的配置[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SKiziKnp-1607568090302)(/maven_43.png)]
  5. 設置子模塊的名稱及存放位置[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QMte8kI0-1607568090304)(/maven_44.png)]

建立 maven_service 模塊

​ 建立 maven_service 模塊的步驟與 maven_dao模塊一致。

建 maven_controller 模塊

​ 建立 maven_service 模塊的步驟與 maven_dao模塊基本一致,只須要將第一步選擇Maven模板設置爲web項目便可。(模板類型:maven-archetype-webapp)

​ 模塊所有建立完畢後,效果以下:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VcQBs1xM-1607568090307)(/maven_45.png)]

修改模塊的配置

  • 設置 JDK 版本
  • 單元測試 JUnit版本
  • 刪除多餘的配置

設置模塊之間的依賴

maven_dao

  1. 新建包

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WrHDcy4C-1607568090311)(/maven_46.png)]

  2. 在包中建立 UserDao類

    外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PKPjn5Rl-1607568090314)(/maven_47.png)

  3. 在類中添加方法

    package com.xxxx.dao;
    
    public class UserDao {
    
        public static void testDao() {
            System.out.println("UserDao Test...");
        }
    }

maven_service

  1. 添加maven_dao的依賴

    <!-- 加入maven_dao模塊的依賴 -->
    <dependency>
        <groupId>com.xxxx</groupId>
        <artifactId>maven_dao</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
  2. 在項目中添加UserService類,並添加方法

    package com.xxxx.service;
    
    import com.xxxx.dao.UserDao;
    
    public class UserService {
    
        public static void testService() {
            System.out.println("UserService Test...");
            // 調用UserDao的方法
            UserDao.testDao();
        }
    
    }

maven_controller

  1. 添加 maven_service 模塊的依賴

    <!-- 加入maven_service模塊的依賴 -->
    <dependency>
        <groupId>com.xxxx</groupId>
        <artifactId>maven_service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
  2. 添加Servlet的依賴

    <!-- Servlet的依賴 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
  3. 新建 Java 類,繼承 HttpServlet 類,並重寫 service方法

    package com.xxxx.controller;
    import com.xxxx.service.UserService;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/user")
    public class UserServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("UserServlet Test...");
            // 調用UserService層的方法
            UserService.testService();
        }
    }
  4. 添加Tomcat插件

    <!-- 添加插件 -->
    <plugins>
        <!-- tomcat7插件 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <!-- <port>8080</port> -->
                <path>/web</path>
                <uriEncoding>UTF-8</uriEncoding>
                <server>tomcat7</server>
            </configuration>
        </plugin>
    </plugins>
  5. 啓動項目

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NQXxHw3e-1607568090323)(/maven_49.png)]

  6. 訪問項目

    訪問地址:http://localhost:8080/web/user

    訪問結果:[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r3cNFUyV-1607568090325)(/maven_50.png)]

  7. 若是啓動失敗,請先將父項目 install

注:若是父項目 install 失敗,則先將全部子模塊 install 成功後,再 install 父項目。

Maven的打包操做

​ 對於企業級項目,不管是進行本地測試,仍是測試環境測試以及最終的項目上線,都會涉及項目的打包操做。對於每一個環境下的項目打包,對應的項目所須要的配置資源都會有所區別,實現打包的方式有不少種,能夠經過ant,或者經過idea 自帶的打包功能實現項目打包,但當項目很大而且須要的外界配置不少時,此時打包的配置就會異常複雜,對於maven 項目,咱們能夠用過 pom.xml 配置的方式來實現打包時的環境選擇,相比較其餘形式打包工具,經過maven 只須要經過簡單的配置,就能夠輕鬆完成不一樣環境下項目的總體打包。

​ 好比下面這樣一個項目,項目中配置了不一樣環境下項目所須要的配置文件,這時候須要完成不一樣環境下的打包操做,此時經過修改pom.xml 以下:

創建對應的目錄結構

​ 使用idea建立項目,目錄結構可能會缺失,須要經過手動添加對應的目錄。

  1. 添加 Java 源文件夾

    選擇項目的 main 文件夾,右鍵選擇New,選擇Directory

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eTlFa7a8-1607568090336)(/maven_27.png)]

    輸入文件夾名 "Java",如圖:

選擇 java 目錄,右鍵選擇 Mark Directory as,選擇 Sources Root。將文件夾標記爲源文件夾。

  1. 添加資源文件夾

    步驟如上,建立文件夾,命名爲 resources,並標記爲 Resources Root[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-34KCnpiN-1607568090343)(/maven_32.png)]

  2. 添加對應的文件夾目錄,及添加不一樣環境下對應的配置文件。(本地環境、測試環境、正式環境)[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qyItPeCg-1607568090345)(/maven_33.png)]

添加Profile配置

<!-- 打包環境配置 開發環境 測試環境 正式環境 -->
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties> 
        <!-- 未指定環境時,默認打包dev環境 -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <env>test</env>
        </properties>
    </profile>
    <profile>
        <id>product</id>
        <properties>
            <env>product</env>
        </properties>
    </profile>
</profiles>

設置資源文件配置

<!-- 對於項目資源文件的配置放在build中 -->
<resources>
    <resource>
        <directory>src/main/resources/${env}</directory>
    </resource>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
            <include>**/*.properties</include>
            <include>**/*.tld</include>
        </includes>
        <filtering>false</filtering>
    </resource>
</resources>

執行打包操做

打開Run/Debug Configuarations窗口,輸入對應的打包命令

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yZcVkePu-1607568090347)(/maven_34.png)]

此時對應打包命令

1. `clean compile package -Dmaven.test.skip=true`

​ 打包默認環境(開發環境)而且跳過maven 測試操做

2. `clean compile package -Ptest -Dmaven.test.skip=true`

​ 打包測試環境而且跳過maven 測試操做

3. `clean compile package -Pproduct -Dmaven.test.skip=true`

​ 打包生產環境而且跳過maven 測試操做

打包成功

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dXGUZgs1-1607568090348)(/maven_35.png)]

不一樣的項目打包的文件不同,通常來講,普通java項目打成jar包,web項目打成war包

Maven依賴的基本概念

依賴的基本配置

​ 根元素project下的dependencies能夠包含多個 dependence元素,以聲明多個依賴。每一個依賴都應該包含如下元素:

  1. groupId, artifactId, version : 依賴的基本座標, 對於任何一個依賴來講,基本座標是最重要的, Maven根據座標才能找到須要的依賴。
  2. Type: 依賴的類型,大部分狀況下不須要聲明。 默認值爲jar
  3. Scope: 依賴範圍(compile,test,provided,runtime,system)

    • compile: 編譯依賴範圍。

      若是沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。

    • test: 測試依賴範圍。

      使用此依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將沒法使用此類依賴。典型的例子就是JUnit,它只有在編譯測試代碼及運行測試的時候才須要。

    • provided: 已提供依賴範圍。

      使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在運行時無效。典型的例子是servlet-api,編譯和測試項目的時候須要該依賴,但在運行項目的時候,因爲容器已經提供,就不須要Maven重複地引入一遍(如:servlet-api)。

    • runtime: 運行時依賴範圍。

      使用此依賴範圍的Maven依賴,對於測試和運行classpath有效,但在編譯主代碼時無效。典型的例子是JDBC驅動實現,項目主代碼的編譯只須要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才須要實現上述接口的具體JDBC驅動。

    • system: 系統依賴範圍。

      該依賴與三種classpath的關係,和provided依賴範圍徹底一致。可是,使用system範圍依賴時必須經過systemPath元素顯式地指定依賴文件的路徑。因爲此類依賴不是經過Maven倉庫解析的,並且每每與本機系統綁定,可能形成構建的不可移植,所以應該謹慎使用。

  4. Optional:標記依賴是否可選
  5. Exclusions: 用來排除傳遞性依賴。

依賴範圍

​ 首先須要知道,Maven在編譯項目主代碼的時候須要使用一套classpath。 好比:編譯項目代碼的時候須要用到spring-core, 該文件以依賴的方式被引入到classpath中。 其次, Maven在執行測試的時候會使用另一套classpath。 如:junit。

​ 最後在實際運行項目時,又會使用一套classpath, spring-core須要在該classpath中,而junit不須要。

​ 那麼依賴範圍就是用來控制依賴與這三種classpath(編譯classpath,測試classpath,運行時classpath)的關係, Maven有如下幾種依賴範圍:

  • Compile 編譯依賴範圍。 若是沒有指定,就會默認使用該依賴範圍。 使用此依賴範圍的Maven依賴, 對於編譯,測試,運行都有效。
  • Test: 測試依賴範圍。 只在測試的時候須要。好比junit
  • Provided: 已提供依賴範圍。 使用此依賴範圍的Maven依賴,對於編譯和測試有效, 但在運行時無效。 典型的例子是servlet-API, 編譯和測試項目的須要, 但在運行項目時, 因爲容器已經提供, 就不須要Maven重複地引入一遍。
  • Runtime: 運行時依賴範圍。 使用此依賴範圍的Maven依賴,對於測試和運行有效, 但在編譯代碼時無效。 典型的例子是:jdbc驅動程序, 項目主代碼的編譯只須要jdk提供的jdbc接口,只有在執行測試或者運行項目的時候才須要實現上述接口的具體jdbc驅動。
  • System: 系統依賴範圍。 通常不使用。

傳遞性依賴

​ 傳遞依賴機制, 讓咱們在使用某個jar的時候就不用去考慮它依賴了什麼。也不用擔憂引入多餘的依賴。 Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到當前項目中。

​ <font color="color">注意: 傳遞依賴有可能產生衝突!!</font>

衝突場景:

A-->B--->C (2.0)

A-->E--->C (1.0)

​ 若是A下同時存在兩個不一樣version的C,衝突!!(選取同時適合A、B的版本)

<dependencies>  
    <dependency>  
        <groupId>A</groupId>  
        <artifactId>A</artifactId>  
        <version>xxx</version>  
        <exclusions>  
            <exclusion>  
                <groupId>C</groupId>  
                <artifactId>C</artifactId> 
            </exclusion>  
        </exclusions>  
    </dependency> 

    <dependency>  
        <groupId>B</groupId>  
        <artifactId>B</artifactId>              
    </dependency>  
</dependencies>
相關文章
相關標籤/搜索