maven梳理

經常使用命令

mvn -v 或者 mvn -version 驗證環境變量。
mvn help:system 打印出全部的系統屬性和環境變量。
mvn compile編譯項目源代碼(不會編譯test 目錄的元代)(會產生target 文件)會去中央倉庫下載項目所依賴的jar包,最後將jar 包的依賴添加classpath 路徑中。
mvn test運行應用程序中的單元測試。
mvn test-compile 編譯測試代碼,compile 以後生成的targer 文件夾 主程序編譯在classes 文件夾下面,測試程序代碼放在test-classes 文件夾下。
mvn clean刪除target 文件夾。
mvn install 安裝項目依賴的jar 到本地倉庫中。
mvn clean compile test組合使用
mvn clean installhtml

本地倉庫路徑配置

conf/settings.xml修改:java

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

推薦不要去修改maven 安裝目錄下的conf/settings.xml (全局),建議拷貝settings.xml 到對應的本地倉庫目錄下面(默認:%USERPROFILE%\.m2/settings.xml),存放路徑: groupId+artifactId(com.cashew.maven+maven-demo1) 即comcashewmavenmaven-demo1。apache

settings.xml詳解tomcat

遠程鏡像倉庫配置

咱們mvn compile的時候maven會去本地倉庫查找是否有對應的jar(依賴),若是沒有默認會去maven 中央倉庫進行下載,
Downloading:https://repo.maven.apache.org/maven2/junit/junit/xxx
maven 的中央遠程倉庫地址是 lib/maven-model-builder-3.3.9.jar中pom-4.0.0.xml文件:服務器

<!--倉庫列表-->
  <repositories>
    <repository>
     <!--中央倉庫的物理標識-->
      <id>central</id>  
      <!-倉庫的名稱--->
      <name>Central Repository</name>
      <!-- 連接的url -->
      <url>https://repo.maven.apache.org/maven2</url>
      <!--默認路徑-->
      <layout>default</layout>
      <!--禁止下載 snapshot -->
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

也能夠在項目的pom.xml文件中配置其餘中央倉庫地址:maven

<repositories>
        <repository>
            <!-- Maven 自帶的中央倉庫使用的Id爲central 若是其餘的倉庫聲明也是用該Id 就會覆蓋中央倉庫的配置 -->
            <id>mvnrepository</id>
            <name>mvnrepository</name>
            <url>https://mvnrepository.com/</url>
            <layout>default</layout>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

maven中央倉庫服務器是在國外的,本身若要配置國內的倉庫鏡像,在setttings.xml中設置:ide

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
 <!--配置國內的阿里雲服務器鏡像-->    
<mirror>
 <id>alimaven</id>
 <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 表明了一個鏡像的替代位置,例如central就表示代替官方的中央庫 -->
  <mirrorOf>central</mirrorOf>
 </mirror>
</mirrors>

設置多個鏡像只會識別第一個鏡像下載jar包。配置的多個mirror能夠都放着不影響,選取一個鏡像下載比較快的放在第一個就行。單元測試

國內其餘鏡像文件
官網說明測試

maven常見項目結構

src
       --main
             --java
                   --package
             --resources
       --test
             --java
                   --package
             --resources
pom.xml
src/main/java 項目的源代碼所在目錄
src/main/resources 項目的資源文件所在的目錄
src/test/java 測試代碼所在的目錄
src/test/resources 測試相關的資源文件所在的目錄
pom.xml  項目工程的描述文件
classes文件夾在target裏

maven命令建立一個項目

第一種:ui

mvn archetype:generate

選擇817,maven將提供 maven-archetype-quickstart骨架

clipboard.png
再輸入groupId、artifactId、version、package(與groupId同)
第二種:

mvn archetype:generate -DgroupId=com.cashew.maven -DartifactId=maven-demo -Dversion=1.0.0-SNAPSHOT -Dpackage=com.cashew.maven

第三種:

mvn archetype:crawl

會在本地倉庫目錄下生成archetype-catalog.xml,移動到.m2目錄,配置參數,執行:

mvn archetype:generate -DarchetypeCatalog=local

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: superpom -->
<project>
  <!-- 指定當前pom 的版本-->
  <modelVersion>4.0.0</modelVersion>
  <!-- 項目包名: 公司地址名稱反寫+項目名稱-->
  <groupId>com.cashew.maven</groupId>
  <!--項目模塊名稱:通常爲 項目名-模塊名 -->
  <artifactId>maven-demo1</artifactId>
  <!-- 
    標識當前項目版本號 
    第一個.號以前的數字標識  表示大版本號
    第二個.號以前的數字標識  表示分支版本號
    第三個.號以前的數字標識  表示小版本號
    
    SNAPSHOT:快照版本
    Release 發佈版本
    Alpha :內部測試版本
    GA:正式發佈的版本
  -->
  <version>1.0.0SNAPSHOT</version>
  <dependencies>
  <!--
   在maven 的世界中 任何一個依賴、插件以及項目構建的輸出均可以成爲構件
   而構件又是經過座標進行惟一標識的。
        官網提供的jar 是否是不少,而且隨着版本升級會有不一樣版本的jar 
     maven 是如何快速的定位獲取對於可能給的jar,就是經過座標的思想來實現的座標由那些元素構成?
    1. groupId
    2. artifactId
    3. version
    4. packaging: zip war jar (默認)
    5. classifer 
      -->
  
    <!--
      maven 是經過dependency 進行依賴的描述
      dependcy 是經過座標元素groupId、artifactId、version
      來進行快速定位的,咱們同時也知道一個項目會有引用多個依賴(jar),因此又爲dependency指定一個dependencies 的容器
    -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.9</version>
    </dependency>
  </dependencies>
  
    <build>
        <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                        <!--指定mvn package時執行tomcat插件-->
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions> 
          </plugin>
    </build>

</project>
<!-- END SNIPPET: superpom -->

依賴範圍

maven 提供三種classpath : 編譯、測試、運行這三種classpath 都是有效。
compile:對於編在編測試、運行這三種classpath 都是有效
test: 測試依賴範圍有效,在編譯和運行項目的時候沒法使用此類的依賴(典型的junit);
provided: 對編譯、測試 classpath 有效,對運行時無效(典型的serlvet);
runtime: 運行時的依賴範圍,對測試和運行有效,在編譯源代碼無效(典型案例:JDBC的驅動實現);
system: 系統的依賴範圍,使用system範圍的依賴的時候必須經過systemPath 元素顯示指定依賴文件的路徑,不依賴於maven倉庫解析,因此可能會形成構建不可移植,慎用!

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

依賴傳遞

clipboard.png

employee 依賴manager, manager依賴boss
employee 經過傳遞 間接也依賴於boss,排除對boss的依賴:

<dependency>
            <groupId>com.cashew.maven</groupId>
            <artifactId>company-manager</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.cashew.maven</groupId>
                    <artifactId>company-boss</artifactId>
                </exclusion>
            </exclusions>
   </dependency>

依賴衝突

employee --->manager(commons-io 2.0)--->boss(commons-io 2.4)

1.短路優先
A--->B--->C---D(1.0.jar)
A--->B--->C(2.0.jar)
A只會有2.0的包

2.相同路徑的時候 先聲明先使用
employee--->manager
employee--->boss
manager先聲明,則A只會有2.0的包

聚合工程

maven 是以模塊的概念進行項目描述的。
現有A、B、C多個模塊的過程,須要聚合到一塊兒,能夠新建一個聚合工程,在該工程的pom.xml中配置:

<packaging>pom</packaging>

並添加模塊依賴列表

<modules>
          <module>../A</module>
          <module>../B</module>
          <module>../C</module>
      </modules>

父子工程

能夠將多個模塊工程的一些共性依賴進行向上的抽取,並組成maven父工程。
如:employee 、manager、boss都有junit 依賴,那麼能夠單獨的去定義一個maven項目封裝這些共性的依賴,稱爲父類 maven項目。在該工程的pom.xml中配置:

<packaging>pom</packaging>

使用dependencyManagement 元素來提供一種管理依賴版本號的方式,讓所在在子項目中引用一個依賴而不用顯示的列出版本號,maven 會沿着父子層次向上走,直到找到使用dependencyManagement的元素的項目 而後它就會使用dependencyManagement 元素的指定的版本號:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  </dependencyManagement>

父工程不須要運行,刪除src/test/java
子模塊工程要繼承父工程,添加:

<parent>
        <groupId>com.cashew.maven</groupId>
        <artifactId>company-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

修改對應的依賴:

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    <dependencies>

好處:若是有多個子項目都引用都一個依賴,則可避免在每一個使用的子項目中都聲明一個版本號,當升級或者切換版本的時候,只須要在頂層父容器裏更新便可。

相關文章
相關標籤/搜索