Maven學習筆記

一.介紹

Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建、報告和文檔的軟件項目管理工具。

1.bin目錄是包含mvn的運行腳本
2.boot目錄包含一個類加載器的框架,maven使用它加載自己的類庫
3.conf配置文件
4.lib包含maven運行時的依賴類庫

二.環境變量的配置

maven環境配置,增加一個環境變量MAVEN_HOME,值是maven的安裝路徑(C:\Program Files\apache-maven-3.5.0-bin
\apache-maven-3.5.0) 修改path則是在path最後面添加;%MAVEN_HOME%\bin。

Maven的項目結構
    項目名
        -src 
           -main
                -java
                     -package
           -test
                -java
                     -package
        -pom.xml

三.常用命令

    mvn -v      查看maven版本
     compile    編譯
     test       測試
     package    打包

     clean      刪除target
     install    安裝jar包到本地倉庫

maven快速創建項目骨架目錄

兩種方式:

1.  mvn archetype:generate 按照提示進行選擇
2.  mvn archetype:generate  -DgroupId=com.imooc.maven   -DartifactId=
  maven-service   -Dversion=1.0.0SNAPSHOT   -Dpackage=com.imooc.maven.demo
    1. -DgroupId=組織名,公司網址反寫+項目名
    2. -DartifactId=項目名+模塊名
    3. -Dversion=版本號
    4. -Dpackage=代碼所存在的包名

四.Maven中的座標和倉庫

構件座標:

        1. groupId:公司名字+項目名
        2. artifactId:項目名+模塊名
        3. varsion:版本號

倉庫:

        1. 本地倉庫
        2. 遠程倉庫
        3. 鏡像倉庫

五.更改倉庫默認路徑

已安裝到本地倉庫中的jar包位置:

C:\Users\用\.m2\repository\com\tiakon\demo

安裝路徑conf文件夾下settings.xml文件 打開找到這段備註是的代碼: ​

複製粘貼出來

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

將localRepository便籤內的值替換成新路徑即可。

六.maven生命週期

完整的項目構建過程包括: 清理、編譯、測試、打包、集成測試、驗證、部署

maven三套獨立的生命週期

    clean   清理項目
            1.pre-clean 執行清理前的工作
            2.clean     清理上一次構建生成的所有文件
            3.post-clean    執行清理後的文件

    default 構建項目(最核心)
            compile test package install

    site    生成項目站點
            1. pre-site     在生成項目站點前要完成的工作
            2. site     生成項目的站點文檔
            3. post-site    在生成項目站點後要完成的工作
            4. site-deploy  發佈生成的站點到服務器上

七.maven中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">
    <!--指定了當前pom的版本-->
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tiakon.maven.demo</groupId>
    <artifactId>HoictasStudio-MavenDemo01</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--
        第一個0表示大版本號
        第二個0表示分支版本號
        第三個0表示小版本號
        0.0.1
        snapshot    快照
        alpha       內部測試
        beta        公測
        Release     穩定
        GA          正式發佈
    -->
    <!--
        打包方式:默認是jar,可選war、zip、pom
        <packaging></packaging>
    -->

      <!--指定編碼格式-->
    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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


    <!--依賴列表-->
    <dependencies>
        <!--依賴項-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <!--<type></type>-->
            <!--依賴範圍-->
            <!--<scope></scope>-->
            <!--設置依賴是否可選(默認)false-->
            <!--<optional></optional>-->
            <!--排斥依賴傳遞列表-->
            <!--
                <exclusions>
                    <exclusion>
                    </exclusion>
                </exclusions>
            -->
        </dependency>
    </dependencies>
    <!--依賴的管理,作用主要定義在父模塊中,對子模塊進行管理-->
    <!--
        <dependencyManagement>
            <dependencies>

            </dependencies>
        </dependencyManagement>
    -->
    <!--對構件的行爲提供相應的支持-->
    <build>
        <!--插件列表-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.0.1</version>

                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>
                                jar-no-fork
                            </goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <!--通常用於子模塊對父模塊pom的繼承-->
    <!--<parent></parent>-->
    <!--用來聚合運行Maven項目,指定多個模塊一起編譯-->
    <!--
        <modules>
            <module></module>
        </modules>
    -->

</project>

八.Maven的依賴範圍

三種classpath
    1. 編譯
    2. 測試
    3. 運行

maven提供了6種可選依賴範圍:

1. compile: 默認範圍,編譯測試運行都有效。

2. provided:    在編譯和測試時有效。(比如說在開發JavaEE時,你在本地運行的servlet,
是需要調用已添加到項目中的servlet-api.jar這個jar包的。這個過程就包含了編譯【就是
把Java文件編譯成class文件的過程中也要調用】和測試【測試就是在本地運行】,那麼他說
的運行是指,整個項目已開發完成,編譯、測試通過後,將class文件或包含有class文件的war包
發佈到服務器上的Tomcat中運行,這時啓動項目,就可以直接調Tomcat中的servlet-api.jar,
不必再將自己的jar包添加到項目中去。也就是說當你選擇provided時,項目發佈時Maven不會將
你添加的jar包,加入到項目中。)

3. runtime: 在測試和運行時有效。(典型例子:JDBC驅動的實現。)
4. test:    只在測試是有效。
5. system:  類似provided,與本機系統相關聯,可移植性差。

6. import:  導入範圍,他只是用在dependencyManagement中,表示從其他的pom中導
入dependecy的配置。(以下引用官網案例並不難理解。)

Importing Dependencies

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>B</artifactId>
  <packaging>pom</packaging>
  <name>B</name>
  <version>1.0</version>
  <dependencyManagement>
        <dependencies>
                  <dependency>
                    <groupId>maven</groupId>
                    <artifactId>A</artifactId>
                    <version>1.0</version>
                    <type>pom</type>
                    <scope>import</scope>
                  </dependency>
                          <dependency>
                            <groupId>test</groupId>
                            <artifactId>d</artifactId>
                            <version>1.0</version>
                          </dependency>
        </dependencies>
  </dependencyManagement>
  <dependencies>
            <dependency>
              <groupId>test</groupId>
              <artifactId>a</artifactId>
              <version>1.0</version>
              <scope>runtime</scope>
            </dependency>
                    <dependency>
                      <groupId>test</groupId>
                      <artifactId>c</artifactId>
                      <scope>runtime</scope>
                    </dependency>
  </dependencies>
</project>

Assuming A is the pom defined in the preceding example, the end result would be the same. All of A’s managed dependencies would be incorporated into B except for d since it is defined in this pom.

假設A是前面示例中定義的pom,那麼最終結果將是相同的。所有管理的依賴項都將被合併到B中,除了在這個pom中定義的d之外。

九.依賴衝突

1.短路優先:

    C->B->A->X1(jar)
    C->B->X2(jar)

【C依賴B,B依賴A,A和B都包含同一個不同版本的Jar,則取B的依賴版本。(c的pom.xml中不必註明jar座標)】

2.先聲明先優先

    如果路徑相同長度相同,則誰先聲明,先解析誰。

【C依賴A和B,A和B都包含同一個不同版本的Jar,誰依賴在前取誰的依賴版本。】

十.聚合與繼承

聚合

<packaging>pom</packaging>
<modules>
    <module>../HoictasStudio-MavenDemo01</module>
    <module>../HoictasStudio-MavenDemo02</module>
    <module>../HoictasStudio-MavenDemo03</module>
</modules>

假設在HoictasStudio-MavenParent模塊中添如以上代碼,輸入clean install命令後,即可同時安裝多個jar到本地倉庫中

    [INFO] HoictasStudio-MavenDemo01 .......................... SUCCESS [  4.618 s]
    [INFO] HoictasStudio-MavenDemo02 .......................... SUCCESS [  0.828 s]
    [INFO] HoictasStudio-MavenDemo03 .......................... SUCCESS [  0.923 s]
    [INFO] HoictasStudio-MavenParent .......................... SUCCESS [  0.021 s]

繼承

根據官方文檔說明繼承會根據父模塊與子模塊的包含與否,對pom.xml的寫法則有兩種。

第一種寫法

假設我們有兩個模塊,前一個叫 com.mycompany.app:my-app:1,後一個叫com.mycompany.app:my-module:1。

my-app的pom文件爲:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

my-module的pom文件爲:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

我們指定如下項目結構:

    .
     |-- my-module
     |   `-- pom.xml
     `-- pom.xml

那麼,我們需要my-module去繼承my-app,則需要在my-module的pom文件中添加以下代碼:

    <project>
      <parent>
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-module</artifactId>
      <version>1</version>
    </project>

第二種寫法

However, that would work if the parent project was already installed inour local repository or was in that specific 
directory structure (parent pom.xml is one directory higher than that of the module's pom.xml). But what if the parent 
is not yet installed and if the directory structure is
.
 |-- my-module
 |   `-- pom.xml
 `-- parent
     `-- pom.xml    

上一段話摘自官網對繼承的介紹,就是說如果你的父模塊已在本地安裝或者父模塊不包含子模塊,目錄級別甚至是 比子模塊的還要高,就在第一種寫法上添加標籤。 ​ com.mycompany.app my-app 1 ../parent/pom.xml 4.0.0 my-module

筆者在看視頻時就發現,當父模塊與子模塊處於同一級別時,在按照視頻中的寫法(第一種寫法)test時就會報錯, 而此時的情況是不包含子模塊,所以應該在標籤中添加標籤即可測試通過。

十一.maven配置阿里雲鏡像

修改setting.xml文件,添加鏡像地址

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

這個地址下載 jar 包的速度,誰用誰知道!

轉自:https://github.com/Tiakon/maven-learning-notes#%E5%85%ABmaven%E7%9A%84%E4%BE%9D%E8%B5%96%E8%8C%83%E5%9B%B4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章