Maven核心知識

1.maven經常使用的構建命令

(1)mvn -v      查看maven版本java

(2)compile    編譯web

(3)test        測試apache

(4)package      打包瀏覽器

(5)clean     刪除targettomcat

(6)install       安裝jar包到本地倉庫中服務器

2.maven自動創建目錄骨架

(1)archetype插件

  • 用於建立符合maven規定的目錄骨架
  • 先建立一個文件夾,其名爲project名

(2)自動建立目錄方式一

  • win+R,cmd,cd到該文件夾路徑下,輸入mvn archetype:generate,enter,第一次會自動下載一些相關依賴
  • enter,輸入6
    • 'groupId' 輸入com.gc.maven;
    • 'artifactId'輸入maven-service;
    • 'version'輸入1.0.0SNAPSHOT;
    • 'package'輸入com.gc.maven.service,
    • enter,輸入y
  • 至此自動建立成功
  • 這是按照提示進行選擇的方法

(3)自動建立目錄方式二

  • win+R,cmd,cd到該文件夾路徑下
  • 輸入mvn archetype:generate -DgroupId=組織名,公司網址的反寫+項目名 -DartifactId=項目名-模塊名 -Dversion=版本號 -Dpackage=代碼所存在的包名

3.maven中的座標和倉庫

(1)座標

  • 構件經過座標做爲其惟一標識
  • groupId,artifactId,version組成項目的基本座標

(2)倉庫

  • 倉庫管理項目的依賴
  • 本地倉庫和遠程倉庫:打開maven—>lib—>maven-model-builder-3.5.4.jar,用360壓縮打開,org—>apache—>maven—>model—>pom-4.0.0.xml,打開,找到<url>https://repo.maven.apache.org/maven2</url>,即爲遠程倉庫
  • 鏡像倉庫:打開maven—>conf—>settings.xml,找到mirrors,配置1-2個鏡像     
   <mirror>
      <id>jboss-public-repository-group</id>
      <mirrorOf>central</mirrorOf>
      <name>JBoss Public Repository Group</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
   </mirror>
   <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
   </mirror>
  • 更改倉庫位置:默認本地倉庫在c盤中C:\Users\guochan\.m2,若是重裝系統可能丟失,因此要更改倉庫位置 
    • 建立一個本地文件夾其路徑爲E:\maven-3.5.0\repository,打開maven—>conf—>settings.xml,找到localRepository,
    • <localRepository>E:/maven-3.5.0/repository</localRepository>
    • win+R cmd ,輸入命令mvn compile測試是否成功

4.在Intellij IDEA中配置maven以及建立maven項目

(1)配置maven

  • Ctrl+Shift+A,輸入maven,選擇maven settings
    • 在maven home directory中選擇maven文件夾目錄,我這裏是D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
    • 在user setting file中選擇override,填入修改好本地倉庫位置的配置文件,我這裏是D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
    • local repository會自動檢測到修改過的本地倉庫路徑
  • 在settings搜索框中輸入runner,找到maven下的runner,在VM Options中輸入-DarchetypeCatalog=internal,若是未配置會致使maven 骨架生成速度緩慢
  • File—>other settings—>default settings,再將剛纔配置一遍,在建立maven項目的時候就不用重複配置了
  • 若是沒有安裝tomcat,到http://tomcat.apache.org/中download core下的zip直接解壓便可,點擊安裝目錄bin/startup.bat啓動服務

(2)建立maven web項目

  1)新建maven項目框架

  • File—>New—>Project,選擇maven,在create from archetype打勾,選擇,next
  • 輸入groupId和artifactId,next
  • 仍然選擇maven home directory爲D:/Program Files (x86)/apache-maven-3.5.4-bin/apache-maven-3.5.4
  • user setting file選擇override,爲D:\Program Files (x86)\apache-maven-3.5.4-bin\apache-maven-3.5.4\conf\settings.xml
  • local repository會自動檢測到修改過的本地倉庫路徑
  • 上述加下劃線的三步若是在default settings中配置過便可忽略
  • 點綠色的+,Name中輸入archetypeCatalog,Value中輸入internal,OK(該屬性設置能夠加快項目建立速度),next,finish
  • 若是建立maven項目失敗,錯誤[ERROR] Maven execution terminated abnormally (exit code 1)
    • 緣由:若是path裏有兩個java環境,則會致使建立失敗
    • 解決辦法:查看Path路徑下發現有C:\ProgramData\Oracle\Java\javapath和%JAVA_HOME%\bin這兩個java環境,刪除C:\ProgramData\Oracle\Java\javapath便可正常建立

  2)手動添加缺失文件夾jsp

  • 建立好的項目結構缺乏一些文件夾,手動補全,Alt+Insert,按照上一篇的目錄結構添加directory,在main下添加java和resources,在src下添加test和resources
  • Ctrl+;調出Project Structure,點擊Modules,main下的java選擇Sources,main下resources選擇Resources;test下的java選擇Tests,test下的resources選擇Test Resources

  3)部署tomcatmaven

  • Run—>Edit Configurations(Ctrl+Shift+J),點綠色+,34 items more,找到Tomcat Server—>Local
    • 在Name中輸入Tomcat名稱
    • 在Server選項卡中:  Application server選擇本機Tomcat安裝路徑
    • 在Deploment選項卡中:  點綠色+,選擇Artifacts,選擇 項目:war exploded,在Application context中填入/項目名/index.jsp
    • 切回Server選項卡中:   On 'Update' action選擇Update classes and resources;On frame deactivation選擇Update classes and resources;OK
  • 點擊Run或者Debug,瀏覽器自動跳轉出http://localhost:8080/項目名/index.jsp/,完成

5.maven的生命週期和插件

(1)完整項目的構建過程

  • 清理、編譯、測試、打包、集成測試、驗證、部署

(2)maven生命週期

  • clean  清理項目
    • pre-clean              執行清理前的工做
    • clean                    清理上一次構建生成的全部文件
    • post-clean            執行清理後的文件
  • default   構建項目(最核心)
    • compile
    • test
    • package
    • install
  • site   生成項目站點
    • pre-site           在生成項目站點前要完成的工做
    • site                      生成項目的站點文檔
    • post-site              在生成項目站點後要完成的工做
    • site-deploy          發佈生成的站點到服務器上

(3)maven的插件

  • 詳細插件信息可查看http://maven.apache.org/plugins/index
  • 下面以使用source插件爲例,但願運行package時便可將源碼打包,在pom.xml中寫入
<build>
    <plugins>
      <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.4.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>jar-no-fork</goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  • 其中goals能夠從上述網站中查看

6.maven中pom.xml解析

  • 小技巧:在寫pom.xml時能夠參考http://mvnrepository.com/ 
<?xml version="1.0" encoding="UTF-8"?>


<!--project是pom.xml的根元素,包含pom約束的信息-->
<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">
  <!--指定當前pom的版本,也是必不可少的元素-->
  <modelVersion>4.0.0</modelVersion>


  <groupId>反寫的公司網址+項目名</groupId>
  <artifactId>項目名+模塊名</artifactId>
  <!--第一個0表示大版本號
      第二個0表示分支版本號
      第三個0表示小版本號
      0.0.1
      snapshot   快照
      alpha      內部測試
      beta       公測
      Release    穩定
      GA         正式發佈
  -->
  <version>1.0-SNAPSHOT</version>
  <!--jar war zip pom-->
  <packaging>war</packaging>


  <name>項目描述名</name>
  <url>項目地址</url>
  <description>項目描述</description>
  <developers>開發人員列表</developers>
  <licenses>開源框架許可證信息</licenses>
  <organization>組織信息</organization>


  <!--依賴列表-->
  <dependencies>
    <!--依賴項-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <type></type>
      <!--依賴範圍 test表示junit只在測試的依賴範圍內有用,在main主代碼中引用junit會報錯-->
      <scope>test</scope>
      <!--設置依賴是否可選,有true和false,默認是false,子項目繼承,若爲true,子項目必須顯示引入該依賴-->
      <optional>false</optional>
      <!--排除依賴傳遞列表-->
      <exclusions>
        <exclusion>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>


  <!--依賴的管理,主要定義在父模塊中,供子模塊繼承-->
  <dependencyManagement>
    <!--依賴列表-->
    <dependencies>
      <!--多個依賴,但這些依賴並不會被運行,不會被引入實際的依賴中-->
      <dependency>
      </dependency>
    </dependencies>
  </dependencyManagement>


  <!--對構件行爲提供相應的支持-->
  <build>
    <!--插件列表-->
    <plugins>
      <plugin>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
      </plugin>
    </plugins>
    <!--一般用於子模塊對父模塊pom的繼承-->
    <parent></parent>
    <!--用來聚合運行多個maven項目,使不少maven模塊一塊兒編譯-->
    <modules>
      <module></module>
    </modules>
  </build>
</project>

7.maven依賴範圍

(1)<scope>

  • maven的依賴範圍
  • 開發時使用某一框架,將該項目的jar包引入到項目的classpath路徑中,項目便可使用該框架爲咱們封裝好的一些方法
  • 依賴範圍就是控制依賴與classpath的關係

(2)maven中的classpath

  • 編譯 
  • 測試:例如junit依賴範圍中的值test代表junit只存在於測試的classpath中
  • 運行

(3)scope的值

  • 打開http://maven.apache.org/,點擊右側欄中的Documentation-Index(category),點開Introductions-The Dependency Mechanism(依賴機制),找到Dependency Scope
  • 有6種scope的值,介紹以下
    • compile:默認的範圍,在編譯、測試、運行時都有效。
    • provided:在編譯、測試時有效。例子:Servlet API加載,運行時不會被加入,由於web容器已經包含了這些API,若是加入進去會致使衝突。
    • runtime:在測試、運行時有效。例子:jdbc驅動的實現,項目主代碼的編譯只須要JDK提供的jdbc的API,只有在執行測試和運行項目的時候才須要實現接口的具體的jdbc驅動。
    • test:只在測試時有效。例子:junit。
    • system:與provided相同,在編譯,測試時有效,與本機系統相關聯,可移植性差,換機子之後可能會出問題。好比咱們要引用本機的JAVA_HOME,若是把項目移植到其餘系統上,可能因爲路徑的不一致而致使錯誤。
    • import:導入的依賴範圍,它只使用在dependencyManagement中,表示從其餘的pom中導入dependency配置(是從其餘pom中繼承的依賴)。

8.maven依賴傳遞

(1)依賴傳遞的例子

  • 假設A依賴於B,B依賴於C
  • 首先在B的pom.xml中添加B對C的依賴
<dependency>
    <groupId>com.gc.C</groupId>
    <artifactId>C</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 再在A的pom.xml中添加A對B的依賴
<dependency>
    <groupId>com.gc.B</groupId>
    <artifactId>B</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 而後對C clean package(生成C的jar包) install(C的jar包安裝到本地倉庫中);再對B clean package(生成B的jar包) install(B的jar包安裝到本地倉庫中)
  • 對A clean compile,即會發如今A的Maven Dependencies中有B.jar和C.jar。在A的pom.xml中並無配置C,因此這就是傳遞依賴

(2)排除依賴

  • 若A只想依賴於B,不想依賴於C,則可在A的pom.xml中加入exclusion,這樣A中Maven Dependencies就自動去除了C.jar
<dependency>
      <groupId>com.gc.B</groupId>
      <artifactId>B</artifactId>
      <version>1.0-SNAPSHOT</version>
      <exclusions>
            <exclusion>
                <groupId>com.gc.C</groupId>
                <artifactId>C</artifactId>
             </exclusion>
       </exclusions>
</dependency>

9.maven依賴衝突

(1)產生依賴衝突的場景

  • A和B依賴了不一樣版本的相同的構件,那麼對依賴A、B的C來講依賴的是哪一個版本的構件,這就產生了依賴衝突

(2)兩條原則

  • 短路優先
    • A—>B—>C—>X(jar)
    • A—>D—>X(jar),選擇此依賴
  • 先聲明先優先
    • 若是路徑長度相同,則誰先聲明,先解析誰

10.maven聚合和繼承

(1)使用聚合的場景:

  • maven中將多個項目install,將其安裝到本地倉庫中,聚合能夠將他們放到一塊兒運行,稱爲聚合

(2)聚合的例子:

  • 想要將項目A,B,C一塊兒install到本地倉庫中
  • 新建一個新的maven項目D,其pom.xml以下
    <packaging>pom</packaging>
    
      <modules>
       <module>../A</module>
       <module>../B</module>
       <module>../C</module>
      </modules>
  • 對D的pom.xml clean install,便可將A,B,C生產jar包並安裝到本地倉庫中
  • D的pom.xml做爲其餘項目pom的容器

(3)使用繼承的場景:

  • 不少項目的pom.xml中有不少重複的配置,例如junit等,能夠利用繼承減小配置

(4)繼承的例子:

  • 假設有parent項目和sub項目,則分別配置parent和sub的pom.xml
  • 新建一個新的maven項目parent,其pom.xml以下
<packaging>pom</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.11</junit.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
  • 在sub項目中的pom.xml修改以下(將junit中的version和scope刪除):
    <parent>
      <groupId>com.gc.parent</groupId>
      <artifactId>parent</artifactId>
      <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
      </dependency>
    </dependencies>
  • 此時junit就能夠從parent的pom中繼承過來
相關文章
相關標籤/搜索