Maven的初識

 

目錄

 

 

一、項目開發中遇到的問題

二、Maven 簡介

三、Maven的安裝

1、Maven的安裝

2、Maven的配置

3、全局配置(默認)

4、用戶配置(如果這裏設置不了的話,可以在全局配置中設置)

四、創建Maven 工程

五、Maven的工程創建

六、Maven的命令

七、使用eclipse創建maven工程配置倉庫地址

八、通過骨架創建maven工程

1、創建工程

九、不通過骨架創建maven工程

創建工程

十、Maven座標主要組成

1、依賴管理

2、依賴範圍     runtime

3、直接依賴和間接依賴

4、依賴衝突

5、可選依賴

6、排除依賴

十一、Maven三大生命週期

clean:清理項目

default:構建項目

site:生成項目站點

十二、Maven插件

十三、Tomcat插件創建一個maven web工程


一、項目開發中遇到的問題

1、都是同樣的代碼,爲什麼在我的機器上可以編譯執行,而在他的機器上就不行?

2、爲什麼在我的機器上可以正常打包,而配置管理員卻打不出來?

3、項目組加入了新的人員,我要給他說明編譯環境如何設置,但是讓我撓頭的是,有些細節我也記不清楚了。

4、我的項目依賴一些jar包,我應該把他們放哪裏?放源碼庫裏?

5、這是我開發的第二個項目,還是需要上面的那些jar包,再把它們複製到我當前項目的svn庫裏吧

6、現在是第三次,再複製一次吧    ----- 這樣真的好嗎?

7、我寫了一個數據庫相關的通用類,並且推薦給了其他項目組,現在已經有五個項目組在使用它了,今天我發現了一個                      bug,並修正了它,我會把jar包通過郵件發給其他項目組

-----這不是一個好的分發機制,太多的環節可能導致出現bug

8、項目進入測試階段,每天都要向測試服務器部署一版。每次都手動部署,太麻煩了。

            maven就可以解決以上的各種問題

二、Maven 簡介

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

Maven是跨平臺的項目管理工具。主要服務於基於Java平臺的項目構建依賴管理項目信息管理

Maven主要有兩個功能:

  • 項目構建(打包(jar,war,部署)
  • 依賴管理(做好配置,自定下載依賴)

三、Maven的安裝

官方網站:http://maven.apache.org

1、Maven的安裝

第一步:安裝jdk,要求1.6或以上版本。

第二步:把maven解壓縮,解壓目錄最好不要有中文。

第三步:配置環境變量MAVEN_HOME

第四步:配置環境變量PATH,將%MAVEN_HOME%\bin加入Path,在Windows中一定要注意要用分號;與其他值隔開。

第五步:驗證是否安裝成功,打開cmd窗口,輸入mvn–v

2、Maven的配置

Maven有兩個settings.xml配置文件,一個是全局配置文件,一個是用戶配置文件。

3、全局配置(默認)

%MAVEN_HOME%/conf/settings.xml是maven全局的配置文件。

該配置文件中配置了本地倉庫(依賴)的路徑,默認就是:~/.m2/repository。其中~表示當前用戶路徑C:\Users\[UserName]。

localRepository:用戶倉庫,用於檢索依賴包路徑

4、用戶配置(如果這裏設置不了的話,可以在全局配置中設置)

~/.m2/settings.xml是用戶的配置文件(默認沒有該文件,需要將全局配置文件拷貝過來在進行修改)

注意:一般本地倉庫的地址不使用默認配置,通常情況下需要在用戶配置中,配置新的倉庫地址。

配置步驟如下:

第一步:創建一個本地倉庫目錄,比如E://repository/maven。

第二步:複製maven的全局配置文件(.settings)到~/.m2目錄下,即創建用戶配置文件

第三步:修改maven的用戶配置文件。

注意:

用戶級別的倉庫在全局配置中一旦設置,全局配置將不再生效,轉用用戶所設置的倉庫,否則使用全局配置文件中的默認路徑倉庫(全局:maven/conf/settings.xml用戶:用戶:~/.m2/settings.xml

四、創建Maven 工程

Project

  |   -src

  |                   |-main

  |                              |-java        ——存放項目的.java文件

  |                              |-resources   ——存放項目資源文件,如spring, hibernate配置文件

  |                              |-webapp———存放jsp,html,web.xml等網頁文件WebContent

  |                 |-test測試代碼

  |                              |-java        ——存放所有測試.java文件,如JUnit測試類

  |                              |-resources   ——測試資源文件

  |    -target             ——目標文件輸出位置例如.class、.jar、.war文件

  |   -pom.xml           ——maven項目核心配置文件

五、Maven的工程創建

  • 第一步:根據maven的目錄結構創建HelloMaven工程(target目錄會在編譯之後自動創建)
  • 第二步:創建HelloWorld.java  在src/main/java/com/tf/maven目錄下新建文件Hello.java

package com.tf.maven;

 

public class HelloWorld {

         public String sayHello(String name){

                   return "Hello World :" + name + "!";

         }

}

  • 第三步:創建TestHelloWorld.java

package com.tf.maven;

 

import org.junit.Test;

import static junit.framework.Assert.*;

 

public class TestHelloWorld{

        

         @Test

         public void testSayHello(){

                   HelloWorldhw = new HelloWorld();

                   String result = hw.sayHello("zhangsan");

                   assertEquals("hello zhangsan",result);

         }      

}

  • 第四步:配置pom.xml

<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">

<!--版本:4.0.0 -->

<modelVersion>4.0.0</modelVersion>

<!--組織名稱:暫時使用組織名稱+項目名稱作爲組織名稱 -->

<!--組織名稱:實際名稱按照訪問路徑規範設置,通常以功能作爲名稱:eg: junit spring -->

<groupId>com.qf.maven</groupId>

<!--項目名稱 -->

<artifactId>HelloWorld</artifactId>

<!--當前項目版本號:同一個項目開發過程中可以發佈多個版本,此處標示0.0.1版 -->

<!--當前項目版本號:每個工程發佈後可以發佈多個版本,依賴時調取不同的版本,使用不同的版本號 -->

<version>0.0.1</version>

<!--名稱:可省略 -->

<name>Hello</name>

 

<!--依賴關係 -->

         <dependencies>

                   <!--依賴設置 -->

                   <dependency>

                            <!--依賴組織名稱 -->

                            <groupId>junit</groupId>

                            <!--依賴項目名稱 -->

                            <artifactId>junit</artifactId>

                            <!--依賴版本名稱 -->

                            <version>4.9</version>

                            <!--依賴範圍:test包下依賴該設置 -->

                            <scope>test</scope>

                   </dependency>                

                  

         </dependencies>

</project>

 

到此maven工程即創建成功。


六、Maven的命令

需要在pom.xml所在目錄中執行以下命令。(cmd中執行命令)

1、Mvn compile

  •    執行mvn compile命令,完成編譯操作
  •   執行完畢後,會生成target目錄,該目錄中存放了編譯後的字節碼文件。

2、Mvn clean

  • 執行完畢後,會將target目錄刪除。

3、Mvn test

  • 執行mvn test命令,完成單元測試操作
  • 執行完畢後,會在target目錄中生成三個文件夾:surefire、surefire-reports(測試報告)、test-classes(測試的字節碼文件)

4、Mvn package

  • 執行mvnpackage命令,完成打包操作
  • 執行完畢後,會在target目錄中生成一個文件,該文件可能是jar、war

5、Mvn install

  • 執行mvn install命令,完成將打好的jar包安裝到本地倉庫的操作
  • 執行完畢後,會在本地倉庫中出現安裝後的jar包,方便其他工程引用

6、mvn clean compile命令

  • 組合指令,先執行clean,再執行compile,通常應用於上線前執行,清除測試類

7、mvn clean test命令

  • 組合指令,先執行clean,再執行test,通常應用於測試環節

8、mvn clean package命令

  •          組合指令,先執行clean,再執行package,將項目打包,通常應用於發佈前
  •          執行過程:
  •                    清理————清空環境
  •                    編譯————編譯源碼
  •                    測試————測試源碼
  •                    打包————將編譯的非測試類打包

9、mvn clean install命令

  • cmd中錄入mvn clean install 查看倉庫,當前項目被髮布到倉庫中
  •          組合指令,先執行clean,再執行install,將項目打包,通常應用於發佈前
  •          執行過程:
  •                    清理————清空環境
  •                    編譯————編譯源碼
  •                    測試————測試源碼
  •                    打包————將編譯的非測試類打包
  •                    部署————將打好的包發佈到資源倉庫中

 

七、使用eclipse創建maven工程配置倉庫地址

1、widows –》首選項:maven

2、

八、通過骨架創建maven工程

1、創建工程

  • 第一步:選擇new→maven→Maven Project

  • 第二步:next
  • 第三步:next  選擇maven的工程骨架,這裏我們選擇quickstart。
  • 第四步:next   輸入GroupId、ArtifactId、Version、Package信息點擊finish完成。
  • 在src/main/java中創建com.tf.maven包,然後創建MavenFirst.java
  • 在src/test/java中創建com.tf.maven包,然後創建TestMavenFirst.java
  • 執行maven命令進行測試
  • 在Eclipse的maven插件中執行maven命令,需要在maven工程或者pom.xml文件上點擊右鍵,選擇Run as→maven build..

可以在菜單中看到maven常用的命令已經以菜單的形式出現。

例如:

Maven clean

Maven install

Maven package

Maven test

  • Maven build和maven build...並不是maven的命令。
  • maven build...只是提供一個命令輸入功能,可以在此功能中輸入自定義的maven命令。如test、run....
  • maven build的功能就是執行上次自定義命令

九、不通過骨架創建maven工程

通過選擇骨架創建maven工程,每次選擇骨架時都需要聯網下載,如果網絡不通或者較慢的情況下會有很長時間的等待。使用很是不方便,所以創建工程時可以不選擇骨架直接創建工程。

創建工程

  • 第一步:選擇new→maven→Maven Project
  • 第二步:next

 

  • 第三步:next

 

Packaging:指定打包方式,默認爲jar。選項有:jar、war、pom。

  • 第四步:點擊finish,完成maven工程創建。
  • 第五步:修改pom文件   在Maven-second工程中依賴使用maven-first工程的代碼

十、Maven座標主要組成

  1. 什麼是座標?

在平面幾何中座標(x,y)可以標識平面中唯一的一點。在maven中座標就是爲了定位一個唯一確定的jar包。

Maven世界擁有大量構建,我們需要找一個用來唯一標識一個構建的統一規範

擁有了統一規範,就可以把查找工作交給機器

  • groupId:定義當前Maven組織名稱
  • artifactId:定義實際項目名稱
  • version:定義當前項目的當前版本
  • 這三個可以唯一的表示一個項目

1、依賴管理

就是對項目中jar 包的管理。可以在pom文件中定義jar包的GAV座標,管理依賴。

依賴聲明主要包含如下元素:

<dependencies>

                   <dependency>

                            <groupId>junit</groupId>

                            <artifactId>junit</artifactId>

                            <version>4.9</version>

                            <scope>test</scope>

                   </dependency>                  

         </dependencies>

2、依賴範圍     <scope>runtime</scope>

其中依賴範圍scope 用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:

1.compile:默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效

2.test:測試依賴範圍。只對於測試classpath有效

3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api

4.runtime:運行時提供。例如:jdbc驅動

3、直接依賴和間接依賴

如果B中使用A,C中使用B,則稱B是C的直接依賴,而稱A是C的間接依賴

C->B                   B->A

C直接依賴B

C間接依賴A

3、依賴範圍對傳遞依賴的影響

左邊第一列表示第一直接依賴範圍  aàb

上面第一行表示第二直接依賴範圍b-->c

中間的交叉單元格表示傳遞性依賴範圍。

總結:

  • 當第二依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致。
  • 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞。
  • 當第二依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也爲provided的依賴,且傳遞性依賴的範圍同樣爲 provided;
  • 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞的依賴範圍爲runtime;

4、依賴衝突

  • 如果直接與間接依賴中包含有同一個座標不同版本的資源依賴,以直接依賴的版本爲準(就近原則

  • a<---bjunit 3.9

  • b<--junit 4.1

1、Maven-first工程中依賴log4j-1.2.8版本

那麼maven-third中依賴的就是log4j-1.2.8

2、maven-second工程中依賴log4j-1.2.9版本

那麼maven-third中依賴的就是log4j-1.2.9,因爲它直接依賴的maven-second項目中依賴的就是1.2.9版本

  • 如果直接依賴中包含有同一個座標不同版本的資源依賴,以配置順序下方的版本爲準(就近原則

Maven-second中依賴log4j-1.2.9和log4j-1.2.14

 

此時log4j-1.2.14版本生效。

5、可選依賴

  • <optional> true/false 是否可選,也可以理解爲是否向下傳遞。
  • 在依賴中添加optional選項決定此依賴是否向下傳遞,
  • 如果是true則不傳遞,如果是false就傳遞,默認爲false

6、排除依賴

ThirdMavenSecondMavenFirstMaven

<exclusions

    <exclusion>

       <groupId>com.tf.maven</groupId>

       <artifactId>maven-first</artifactId>

    </exclusion>

</exclusions>

排除依賴包中所包含的依賴關係,不需要添加版本號

如果在本次依賴中有一些多餘的jar包也被傳遞依賴過來,如果想把這些jar包排除的話可以配置exclusions進行排除。

十一、Maven三大生命週期

clean:清理項目

每套生命週期都由一組階段(Phase)組成,我們平時在命令行輸入的命令總會對應於一個特定的階段。比如,運行mvn clean ,這個的clean是Clean生命週期的一個階段。有Clean生命週期,也有clean階段。Clean生命週期一共包含了三個階段:

 

pre-clean 執行一些需要在clean之前完成的工作

clean 移除所有上一次構建生成的文件

post-clean 執行一些需要在clean之後立刻完成的工作

 

mvn clean 中的clean就是上面的clean,在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行,也就是說,mvn clean 等同於mvn pre-clean clean ,如果我們運行mvn post-clean ,那麼 pre-clean,clean 都會被運行。這是Maven很重要的一個規則,可以大大簡化命令行的輸入。

 

default:構建項目

Default生命週期是Maven生命週期中最重要的一個,絕大部分工作都發生在這個生命週期中。這裏,只解釋一些比較重要和常用的階段:

validate

generate-sources

process-sources

generate-resources

process-resources 複製並處理資源文件,至目標目錄,準備打包。

compile 編譯項目的源代碼。

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources 複製並處理資源文件,至目標測試目錄。

test-compile 編譯測試源代碼。

process-test-classes

test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署。

prepare-package

package 接受編譯好的代碼,打包成可發佈的格式,如 JAR 。

pre-integration-test

integration-test

post-integration-test

verify

install 將包安裝至本地倉庫,以讓其它項目依賴。

deploy 將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享。

 

運行任何一個階段的時候,它前面的所有階段都會被運行,這也就是爲什麼我們運行mvn install 的時候,代碼會被編譯,測試,打包。此外,Maven的插件機制是完全依賴Maven的生命週期的,因此理解生命週期至關重要。

site:生成項目站點

pre-site 執行一些需要在生成站點文檔之前完成的工作

site 生成項目的站點文檔

post-site 執行一些需要在生成站點文檔之後完成的工作,並且爲部署做準備

site-deploy 將生成的站點文檔部署到特定的服務器上

 

這裏經常用到的是site階段和site-deploy階段,用以生成和發佈Maven站點,這可是Maven相當強大的功能,Manager比較喜歡,文檔及統計數據自動生成,很好看。

十二、Maven插件

Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的。每個插件都能實現一個功能,每個功能就是一個插件目標。Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務。

 

例如compile就是插件maven-compiler-plugin的一個插件目標

 

  1. Maven編譯插件   (jre默認的是1.5,添加完插件後,工程右鍵-->Maven->update project--->Force update....打對勾 )

  <build>
   <plugins>
     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
                   <source>1.8</source>
                   <target>1.8</target>
                   <encoding>UTF-8</encoding>
         </configuration>
    </plugin>
  </plugins>
 </build>

 

Maven-tomcat插件:  Maven build..  --->輸入tomacat7:run運行

<!--插件 -->

<bulid>

         <plugins>

              <plugin>

         <groupId>org.apache.tomcat.maven</groupId>

         <artifactId>tomcat7-maven-plugin</artifactId>

         <version>2.2</version>

       <configuration>  
        <port>8081</port>  <!-- 配置端口 -->
         <path>/</path>    <!--- 訪問路徑爲:http://localhost:8081/->
      </configuration>

              </plugin>

         </plugins>

</build>

 

修改配置文件後,在工程上點擊右鍵選擇maven→update project configration

十三、Tomcat插件創建一個maven web工程

  • 第一步:不選用骨架
  • 第二步:將打包方式選擇爲war
  • 第三步:點擊finish,工程創建成功。
  • 第四步:在工程中添加web.xml

 

Web.xml內容如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

    id="WebApp_ID"version="2.5">

    <welcome-file-list>

       <welcome-file>index.html</welcome-file>

       <welcome-file>index.htm</welcome-file>

       <welcome-file>index.jsp</welcome-file>

       <welcome-file>default.html</welcome-file>

       <welcome-file>default.htm</welcome-file>

       <welcome-file>default.jsp</welcome-file>

    </welcome-file-list>

</web-app>

  • 第五步:在webapp下創建index.jsp

出錯:因爲項目缺少servlet api   和jsp的依賴

 

<dependency>
  
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>

  </dependency>
 <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
 </dependency>

 

 

 

十四、修改Maven工程1.5的JRE 

 

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