1、maven 3.5 下載地址:http://maven.apache.org/download.cgi
2、下載了解壓到
3、配置環境變量
4、測試看是否安裝成功
5、maven配置(全局配置,用戶配置)
3.1、全局配置
在maven安裝目錄的conf里面有一個settings.xml文件,這個文件就是maven的全局配置文件。
該文件中配置來maven本地倉庫的地址
默認在系統的用戶目錄下的m2/repository中,該目錄是本地倉庫的目錄。
5.2、用戶配置
用戶配置文件的地址:~/.m2/settings.xml,該文件默認是沒有,需要將全局配置文件拷貝一份到該目錄下。
重新指定本地倉庫地址,如果不指定,則默認是~/.m2/repository目錄,如果用戶配置文件不存在,則使用全局配置文件的配置。
一、Maven常用命令
1.1、Maven 參數
-D 傳入屬性參數
-P 使用pom中指定的配置
-e 顯示maven運行出錯的信息
-o 離線執行命令,即不去遠程倉庫更新包
-X 顯示maven允許的debug信息
-U 強制去遠程參考更新snapshot包
例如 mvn install -Dmaven.test.skip=true -Poracle
其他參數可以通過mvn help 獲取
1.2、maven常用命令
1、mvn clean
說明: 清理項目生產的臨時文件,一般是模塊下的target目錄


2、mvn package
說明: 項目打包工具,會在模塊下的target目錄生成jar或war等文件,如下運行結果。
生成的文件 如下:
3、mvn test
說明: 測試命令,或執行src/test/java/下junit的測試用例.
4、mvn install
說明: 模塊安裝命令 將打包的的jar/war文件復制到你的本地倉庫中,供其他模塊使用 -Dmaven.test.skip=true 跳過測試(同時會跳過test compile)


5、mvn deploy
說明: 發布命令 將打包的文件發布到遠程參考,提供其他人員進行下載依賴 ,一般是發布到公司的私服,這里我沒配置私服,所以就不演示了。
三、POM文件講解
POM全稱是Project Object Model,即項目對象模型。pom.xml是maven的項目描述文件,它類似與antx的project.xml文件。pom.xml文件以xml的 形式描述項目的信息,包括項目名稱、版本、項目id、項目的依賴關系、編譯環境、持續集成、項目團隊、貢獻管理、生成報表等等。總之,它包含了所有的項目 信息。
3.2.1. pom.xml的基本配置
[java] view plaincopy
- <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.lin.learning</groupId>
- <artifactId>maven-hellowrold</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>maven-hellowrold</name>
- <url>http://maven.apache.org</url>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- </project>
modelVersion 描述這個POM文件是遵從哪個版本的項目描述符。
groupId 針對一個項目的普遍唯一識別符。通常用一個完全正確的包的名字來與其他項目的類似名字來進行區分(比如:org.apache.maven)。
artifactId 在給定groupID 的group里面為artifact 指定的標識符是唯一的 , artifact 代表的是被制作或者被一個project應用的組件(產出物)。
version 當前項目產生的artifact的版本以上4個元素缺一不可,其中groupId, artifactId, version描述依賴的項目唯一標志。
1. pom.xml文件結構
[html] view plaincopy
- <project>
- <modelVersion>4.0.0</modelVersion>
- <!- The Basics 項目的基本信息->
- <groupId>...</groupId>
- <artifactId>...</artifactId>
- <version>...</version>
- <packaging>...</packaging>
- <dependencies>...</dependencies>
- <parent>...</parent>
- <dependencyManagement>...</dependencyManagement>
- <modules>...</modules>
- <properties>...</properties>
- <!- Build Settings 項目的編譯設置->
- <build>...</build>
- <reporting>...</reporting>
- <!- More Project Information 其它項目信息 ->
- <name>...</name>
- <description>...</description>
- <url>...</url>
- <inceptionYear>...</inceptionYear>
- <licenses>...</licenses>
- <organization>...</organization>
- <developers>...</developers>
- <contributors>...</contributors>
- <!-- Environment Settings ->
- <issueManagement>...</issueManagement>
- <ciManagement>...</ciManagement>
- <mailingLists>...</mailingLists>
- <scm>...</scm>
- <prerequisites>...</prerequisites>
- <repositories>...</repositories>
- <pluginRepositories>...</pluginRepositories>
- <distributionManagement>...</distributionManagement>
- <profiles>...</profiles>
- </project>
project是pom.xml的根節點,至於其它元素請參考POM Reference
2.、POM很重要的3個關系
POM有3個很重要的關系:依賴、繼承、合成。
2.1. 依賴關系
[html] view plaincopy
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.0</version>
- <type>jar</type>
- <scope>test</scope>
- <optional>true</optional>
- </dependency>
- ...
- </dependencies>
如果想依賴一個maven庫中沒有的一個jar包,方法很簡單,就是先將此jar包使用以下的命令安裝到本地maven庫中:
mvn install:install-file -Dfile=my.jar -DgroupId=mygroup -DartifactId=myartifactId -Dversion=1
再把依賴關系加進去即可。
2.2. 繼承關系
另一個強大的變化, maven帶來的是項目繼承。
2.2.1. 定義父項目
[html] view plaincopy
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.mygroup </groupId>
- <artifactId>my-parent</artifactId>
- <version>2.0</version>
- <packaging>pom</packaging>
- </project>
packaging 類型,定義值為 pom用於定義為parent和合成多個項目。 當然我們創建的maven項目的pom都繼承maven的super pom, 如果想看項目(父或子)的完全的pom結構,可以運行:
mvn help:effective-pom
3、maven-eclipse-plugin插件
1、mvn eclipse:eclipse
說明: 生成eclipse配置文件,導入到eclipse開放,如果是使用m2eclipse插件,則可以不用次命令.直接使用插件導入到eclipse進行開放
注:通過次命令生產的項目,需要在eclipse中配置M2_HOME的命令,指向你的本地倉庫文件夾.
來看看生成的結果:。classpath就是字節碼
2、mvn eclipse:m2eclipse
生成eclipse配置文件,該配置文件需依賴eclipse 中有m2eclipse
-DdownloadSources=true 下載依賴包的源碼文件
-Declipse.addVersionToProjectName=true 添加版本信息到項目名稱中
3、mvn eclipse:clean
清除eclipse的項目文件
看看文件內容,沒有project文件 了
4、maven-jetty-plugin插件
1、mvn jetty:run
說明: 可以直接用jetty的服務器運行 注:此命令只適用於war的模塊,即web模塊.
2、mvn archetype:generate
說明: 模塊創建命令, 執行命令后,會提示選擇創建項目的模版,這里選18(maven-archetype-quickstart)
后面會提示你輸入groupId(包存放的路徑):
eg:com.lin
提示輸入artifactId(模塊名稱):
eg:test-core
提示輸入version(版本):
1.0.0-SNAPSHOT
提示輸入package(指項目中基本的包路徑):
eg:com.lin
提示確認,回車即可
5、maven-release-plugin插件
說明: 發行版本,可與scm工具集成,來提供版本管理.不等同與版本控制.允許是必須有goal.兩個常用的goal如下:
1、mvn release:clean
清理release操作是遺留下來的文件

2、mvn release:branch
說明: 創建分支,會在分支下創建執行的分支路徑
-DbranchName=xxxx-100317 分支中的名稱
-DupdateBranchVersions=false 是否更新分支的版本信息,默認為false
-DupdateWorkingCopyVersions=false 是否更新主干的版本信息,默認為true
3、mvn release:prepare
創建標記,會有交互過程,提示tag中pom的版本及trunk下的新版本號,每個模塊都會詢問,默認是最小版本號+1
-Dtag = 4.4.0 將在tags創建該名稱文件夾
-DdryRun=true 檢查各項設置是否正確,可做測試用,會產生一些修改的配置文件信息.
命令:
mvn release:perform
次命令會自動幫我們簽出剛才打的tag,然后打包,分發到遠程Maven倉庫中
6、Maven站點報表
1、mvn project-info-reports:dependencies
生成項目依賴的報表
2、mvn dependency:resolve
查看依賴

查看項目依賴情況
3、mvn dependency:tree
打印出項目的整個依賴樹
4、mvn dependency:analyze
幫助你分析依賴關系, 用來取出無用, 重復依賴的好幫手

5、mvn install -X
追蹤依賴的完整軌跡

6、生命周期
resource->compile->process-classes->process-test-resources->test-compile->test->prepare-package->package
resources:resources 綁定在resource處理階段, 用來將src/main/resources下或者任何指定其他目錄下的文件copy到輸出目錄中
resources:testResources 將test下的resources目錄或者任何指定其他目錄copy到test輸出目錄下
compiler:testCompile 將測試類編譯(包括copy資源文件)
surefire:test 運行測試用例
jar:jar 打jar包
二、各種范圍
compile(編譯范圍)
compile是默認的范圍;如果沒有提供一個范圍,那該依賴的范圍就是編譯范圍。編譯范圍依賴在所有的classpath中可用,同時它們也會被打包。
provided(已提供范圍)
provided依賴只有在當JDK或者一個容器已提供該依賴之后才使用。例如,如果你開發了一個web應用,你可能在編譯classpath中需要可用的Servlet API來編譯一個servlet,但是你不會想要在打包好的WAR中包含這個Servlet API;這個Servlet API JAR由你的應用服務器或者servlet容器提供。已提供范圍的依賴在編譯classpath(不是運行時)可用。它們不是傳遞性的,也不會被打包。
runtime(運行時范圍)
runtime依賴在運行和測試系統的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要JDBC API JAR,而只有在運行的時候才需要JDBC驅動實現。
test(測試范圍)
test范圍依賴 在一般的 編譯和運行時都不需要,它們只有在測試編譯和測試運行階段可用。
system(系統范圍)
system范圍依賴與provided類似,但是你必須顯式的提供一個對於本地系統中JAR文件的路徑。這么做是為了允許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven也不會在倉庫中去尋找它。。如果你將一個依賴范圍設置成系統范圍,你必須同時提供一個systemPath元素。注意該范圍是不推薦使用的(你應該一直盡量去從公共或定制的Maven倉庫中引用依賴)。