前言
工作中maven用的最多的就是導入各種別人已經生成好的dependency或者上傳自己的api包,但是針對maven其他的一些功能似乎接觸比較少,這裏梳理一下。
之前接觸過maven的一些東西,但是這些東西都不太系統,有些maven的課程,一上來就是各種生命週期,都給整懵了,想着這玩意還是自己來總結一下吧。至於什麼是maven,這玩意完成了什麼工作,如何簡便了我們開發中jar包管理的東西,這裏就不做介紹了,直接上官網吧——maven官網。
maven手動構建實例
爲了理解maven的生命週期,這裏我們開始手動構建一個簡單的maven項目
準備工作
按照maven項目管理的文件夾規範建立如下文件夾結構(maven還是一個項目週期與項目依賴管理組件,既然我們需要將項目交給maven組件去管理,就需要按照maven的規範建立項目目錄)
建好之後在src目錄下創建一個pom.xml文件
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn.maven</groupId>
<artifactId>HelloMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<!--添加依賴的jar包-->
<dependencies>
<!--項目要使用到junit的jar包,所以在這裏添加junit的jar包的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
準備一個可執行的java類放置於src/main/com/learn/maven下
public class HelloMaven {
public static void main(String[] args) {
System.out.println("hello maven");
}
}
編譯,清理,測試,打包
這是maven中常說的項目的週期,對應項目的幾個階段。
mvn compile 編譯
這個階段就類似於javac的操作,對源代碼進行一些編譯處理,檢查代碼是否存在語法等編譯報錯。
編譯完成之後,就會在項目的根目錄下多出一個target文件夾
裏面有我們編譯好的class文件
mvn clean 清理
clean相對而言比較簡單,從表現形式上來說就是刪除已經編譯好的文件
mvn test 測試
在src/test/com/learn/maven/下準備一個測試類,內容如下:
import org.junit.Test;
public class HelloMavenTest{
@Test
public void testHello(){
System.out.println("this is maven hello test");
}
}
mvn test 就是執行這些測試代碼,如果測試不通過,則並不會成功打包項目,在打包時可以通過 mvn package -Dmaven.test.skip=true命令跳過測試。
同樣在根目錄下執行mvn test
在target目錄中會多處如下文件夾test-classes 裏面存放着所有編譯過後的測試類文件。同時我們也看到maven也在執行測試代碼之前也幫我們編譯了代碼。
mvn package 打包
這一步是將我們的代碼打包成jar包。
打包完成之後,我們可看到在target目錄下生成了對應的jar包
默認名稱是我們的項目名+版本號。
mvn install 部署
執行mvn install命令之後maven會將我們的jar包放到maven的倉庫(我們下載的倉庫)中
進入我們的本地倉庫中,可以看到對應的文件
之後我們就可以在其他項目中引用我們的這個jar包了。
使用maven自動構建
maven給我們已經提供了很多現成的腳手架,我們可以通過mvn archetype:create或者maven archetype:generate來進行創建,如下所示
mvn archetype:generate -DgroupId=com.learn.maven.archetype -DartifactId=Selfquickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
一般格式
mvn archetype:generate -DgroupId=[自己項目的groupid] -DartifactId=[自己項目的artifactid] -DarchetypeArtifactId=[使用哪一個mavenarchetypeid構建] -DinteractiveMode=false
使用"mvn archetype:generate"命令和"mvn archetype:create"都可以創建項目,目前沒有發現這兩者的區別,唯一區別的地方就是發現使用"mvn archetype:generate"命令創建項目時要特別長的時間才能夠將項目創建好,而使用"mvn archetype:create"命令則可以很快將項目創建出來,同時使用create的項目默認是在操作系統的用戶目錄下生成。
如圖所示,是採用maven自動構建生成的項目目錄
maven的一些概念
前面我們總結了手動和自動構建maven項目的操作,這裏我們可先介紹一下maven的概念了
maven座標
我們通過groupId,artifactId,version,packaging來定位每一個maven項目
groupId——組織包名(一般是公司名稱)
artifactId——項目名稱
version——項目版本名
packaging——項目的打包方式,通常就是jar和war
maven依賴
簡單點理解maven依賴就是我們項目所依賴的一些jar包,通常在pom.xml文件中的dependenties標籤中進行管理。
依賴管理
主要通過pom文件中的dependencies標籤進行管理
<!--添加依賴的jar包-->
<dependencies>
<!--項目要使用到junit的jar包,所以在這裏添加junit的jar包的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
依賴範圍
依賴範圍scope用來控制依賴和編譯,測試,運行的classpath的關係. 主要的是三種依賴關係如下:
1.compile:默認編譯依賴範圍。對於編譯,測試,運行三種classpath都有效
2.test:測試依賴範圍。只對於測試classpath有效
3.provided:已提供依賴範圍。對於編譯,測試的classpath都有效,但對於運行無效。因爲由容器已經提供,例如servlet-api
4.runtime:運行時提供。例如:jdbc驅動
至於傳遞性依賴和可選依賴,這個在後面再進行探討。
maven倉庫管理
總體來說分爲遠程倉庫,本地倉庫和私服,我們後續會嘗試搭建一個私服來管理jar包。
maven的繼承與聚合
聚合
如果想要一次構建多個項目,就需要對多個項目進行聚合。通常聚合的配置如下
<modules>
<module>../module01</module>
<module>../module02</module>
</modules>
繼承
繼承爲了消除重複,我們把很多相同的配置提取出來,已經父項目已經引用的文件
<parent>
<groupId>com.learn.maven.archetype</groupId>
<artifactId>parent</artifactId>
<version>1.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
實例
我們通過mvn archetype:generate構建三個項目
mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=module01 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn archetype:create -DgroupId=com.learn.maven.archetype -DartifactId=module02 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
完成之後如下所示:
之後修改parent的pom文件,標明需要聚合的模塊
<modules>
<module>../module01</module>
<module>../module02</module>
</modules>
在兩個子項目中繼承parent
<parent>
<groupId>com.learn.maven.archetype</groupId>
<artifactId>parent</artifactId>
<version>1.0.1-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
之後進入parent文件夾下對parent進行編譯,可以發現會編譯module01和module02
子模塊在引用父類模塊的依賴時,不需要指定版本號。
搭建私服
由於本地網絡原因,我私服版本被禁用了,nexus無法訪問遠程倉管,現附上一篇大牛的博客 nexus私服搭建。
settings.xml文件
setting.xml文件是maven的全局配置文件,類似於我們一個web應用中的web.xml文件。同時,將settings.xml拷貝到不同用戶的倉庫目錄下,可針對不同用戶使用不同的settings.xml文件。默認情況下maven包中的settings.xml是maven的全局配置文件
下面針對settings.xml文件中的標籤來進行說明
mirror
mirrors標籤,表示配置鏡像所在的路徑的。默認的地址是國外的:https://repo.maven.apache…,maven要幫你管理jar,這些jar包下載的地址是從該地址下的,當然這個下載地址可以改變,就是通過mirrors標籤。一方面國外鏡像的地址下載速度比較慢,所以可以考慮國內鏡像的地址,比如阿里雲的。
localRepository
配置本地倉庫地址。這個在settings.xml文件中已經有示例了
<localRepository>/path/to/local/repo</localRepository>
interactiveMode
interactiveMode 標識maven是否需要和用戶交互以獲得輸入,如果maven需要和用戶交互以獲得輸入,那麼則設置成true,不然則設置爲false。
offline
offline標識maven是否需要在離線模式下運行。
pluginGroups
pluginGroups當插件的組織id(groupId)沒有顯示提供時,供搜尋插件組織Id的列表.
servers
倉庫的下載和部署是在pom.xml文件中進行定義的。比如說用戶名,密碼需要訪問遠程倉庫的時候,有時候需要安全認證,這個認證就可以配置在servers標籤中。
profiles
根據環境參數來調整構建配置的列表
pom.xml文件
三個必填字段——groupId,artifactId,version
有三個必填的字段
由groupId artifactId version所組成的就可以唯一確定一個項目
groupId標識的項目組(填寫公司的域名) 組織
artifactId項目名稱
version版本號
dependencies
這個標籤就是用來配置我們項目中具體需要哪些jar包
properties
用來定義pom中的一些屬性的
build
指定如何構建當前項目的,其中有兩個標籤
source
指定了當前構建的source目錄
plugin
指定了進行構建時使用的插件
package
指定當前構建項目的類型,war jar pom
maven 插件簡介
maven實際上是一個依賴插件執行的框架,每個人物都是由插件完成的。主要分爲兩種插件類型——build插件和 reporting插件.。
build和reporting均需要在pom.xml中進行配置,前者在構建時執行,後者在項目網站生成過程中執行。
build類型的插件需要在標籤中進行配置,如果是reporting類型的插件,需要在標籤中進行配置