maven的簡單使用
1、maven的使用背景
maven是一個成熟的項目管理工具,它的核心理念是POM(Project Object Model)項目對象模型,把一整個項目當做對象,類似Java的OOP(面向對象)。是可以通過描述信息來完成項目
的構建。
maven有一個很重要的概念叫做“倉庫”(repository),在傳統保守的開發模式中,以下情形很常見:
我們會在工作中同時創建很多項目,每個項目可能都會引用一些公用的jar包,一種作法是每個項目裏,都複製一份這些依賴的jar包(或dll文件),這樣顯然不好,相同的文件在硬盤上保存了多份,太佔用空間,
而且這些依賴的jar包(或dll文件)的版本也不太好管理(比如某個公用的jar包,從1.0升級到2.0,如果所有引用這個jar包的項目都需要更新,必須一個個項目的修改)。
maven的倉庫則很好的解決了這些問題,它在每臺機器上創建一個本機倉庫,把本機上所有maven項目依賴的jar包統一管理起來,而且這些jar包用“座標”來唯一標識(理解成“唯一識別某個jar包文件名、版本號”的標識即可),這樣所有maven項目就不需要再象以前那樣把jar包複製到lib目錄中,整個maven項目看起來十分清爽。
2、安裝maven和配置環境變量
先從官網http://maven.apache.org/download.cgi 下載最新版本,下載完畢後解壓壓縮文件到某個路徑,如:E:\apache-maven-3.3.9
然後配置環境變量,做法和配置jdk的環境變量類似:新建一個MAVEN_HOME:E:\apache-maven-3.3.9的變量,然後在Path中加入;%MAVEN_HOME%/bin即可。
在dos窗口運行命令mvn -v 如果出現maven的安裝版本信息,說明maven安裝成功~ 注意:mvn是maven的核心指令。
在使用
3、倉庫和settings.xml配置文件
settings.xml配置文件是用於確定maven在運行時的各種配置的。這包含了本地倉庫位置,遠程倉庫服務器以及認證信息等。
settings.xml存在於兩個地方:
一是用戶安裝目錄:%MAVEN_HOME%/conf/settings.xml --用戶配置,
二是用戶的目錄如:C:/Users/用戶名/.m2/settings.xml --全局配置
用戶配置優先全局配置,都存在時,內容將被合併。
下面以一個典型的settings.xml配置文件來說下:
<settings> <!-- 本地倉庫的配置,默認是C:/Users/用戶名/.m2/repository --> <localRepository>E:\mvn-repository</localRepository> <!-- 是否需要和用戶交互獲得輸入 --> <interactiveMode>true</interactiveMode> <!-- 是否需要在離線模式下運行 --> <offline>false</offline> <!--遠程倉庫的鏡像列表 --> <mirrors> <mirror> <!--鏡像的ID --> <id>xx-repository</id> <!-- 鏡像名 --> <name>test Repository Manager</name> <!--該鏡像的URL。構建系統會優先考慮使用該URL,而非使用默認的服務器URL。 --> <url>http://xx.xx.xx.xx:10000/nexus/content/groups/test</url> <!-- 被鏡像的服務器ID,用*表示所有 --> <mirrorOf>*</mirrorOf> </mirror> </mirrors> <!-- 服務端的一些設置 --> <servers> <server> <!--server的id --> <id>xxx</id> <!--鑑權用戶名。鑑權用戶名和鑑權密碼錶示服務器認證所需要的登錄名和密碼。 --> <username>xxx</username> <!--鑑權密碼 。鑑權用戶名和鑑權密碼錶示服務器認證所需要的登錄名和密碼。 --> <password>xxxx</password> </server> <server> <id>xxx</id> <username>xxx</username> <password>xxxx</password> </server> </servers> <!--根據環境參數來調整構建配置的列表。--> <profiles> <!--根據環境參數來調整的構件的配置 --> <profile> <!-- 配置的唯一標識 --> <id>xxx</id> <!--自動觸發profile的條件邏輯。Activation是profile的開啓鑰匙。--> <activation> <!-- profile默認是否激活的標識 --> <activeByDefault>true</activeByDefault> <!-- jdk的版本 --> <jdk>1.7</jdk> </activation> <!--遠程倉庫列表,它是Maven用來填充構建系統本地倉庫所使用的一組遠程項目。 --> <repositories> <repository> <!-- 遠程倉庫的唯一標識 --> <id>center</id> <!--遠程倉庫名--> <name>center</name> <!--如何處理遠程倉庫裏發佈版本的下載--> <releases> <!--true或者false表示該倉庫是否爲下載某種類型構件(發佈版,快照版)開啓。 --> <enabled>true</enabled> <!-- 指定本地倉庫更新的頻率,即與遠程倉庫同步的頻率。 --> <updatePolicy>always</updatePolicy><!-- always(一直),daily(默認,每日),interval:X(這裏X是以分鐘爲單位的時間間隔),或者never(從不)。 --> <!--當Maven驗證構件校驗文件失敗時該怎麼做:--> <checksumPolicy>warn</checksumPolicy><!--ignore(忽略),fail(失敗),或者warn(警告)。 --> </releases> <!--如何處理遠程倉庫裏快照版本的下載。有了releases和snapshots這兩組配置,POM就可以在每個單獨的倉庫中,爲每種類型的構件採取不同的策略。--> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> <!--遠程倉庫URL--> <url>http://xx.xx.xx.xx:10000/nexus/content/groups/test</url> <!--用於定位和排序構件的倉庫佈局類型-可以是default(默認)或者legacy(遺留)。--> <layout>default</layout> </repository> </repositories> <!--發現插件的遠程倉庫列表。倉庫是兩種主要構件的家。第一種構件被用作其它構件的依賴。這是中央倉庫中存儲的大部分構件類型。另外一種構件類型是插件。--> <pluginRepositories> <!--連接到遠程插件倉庫的信息,與repository類似--> <pluginRepository> <id>plugins</id> <name>Plugins</name> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> <url>http://xx.xx.xx.xx:10000/nexus/content/groups/test</url> <layout>default</layout> </pluginRepository> </pluginRepositories> </profile> </profiles> <!-- 手動激活profiles的列表 --> <!--任何在activeProfile中定義的profile id,不論環境設置如何,其對應的 profile都會被激活。--> <!--如果沒有匹配的profile,則什麼都不會發生。例如,env-test是一個activeProfile,則在pom.xml(或者profile.xml)中對應id的profile會被激活。--> <activeProfiles> <activeProfile>test</activeProfile> </activeProfiles> </settings>
關於該配置文件的說明註釋已經給出。
注:在第一次從遠程導入項目或創建項目的時候,會從指定鏡像下載jar包信息到本地倉庫,今後本地項目依賴的jar包就位於本地倉庫了。
4、創建maven項目
1)首先切換到工作目錄如:F:/gitwork
2)在該目錄下運行命令mvn archetype:generate就能創建一個maven項目,但是建議同時帶上多個參數:
-DgroupId=com.company.appname 組id
-DartifactId=appname 項目名稱,maven會根據這個名稱在當前目錄下新建一個名爲該名稱的目錄用於建立項目
-DinteractiveMode=false 是否已交互模式進行,如果是false的話就會採用默認設置建立項目
如:mvn archetype:generate -DgroupId=com.test -DartifactId=maven-hello -DinteractiveMode=false (默認創建一般java項目)
和:mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.company.appname -DartifactId=appname(創建web項目)
當然在實際開發中一般是遠程導入或者利用IDE工具創建~
3)我們把創建好的maven項目import到IDE工具比如說Eclipse中:
一般項目:
主要關注一般項目的結構:
src/main/java——存放java代碼的地方;
src/test/java——存放測試代碼的地方
target——存放編譯文件的地方
pom.xml——描述該maven項目信息的配置文件
web項目:
主要結構跟一般項目類似(只是這裏默認創建的沒有存放Java代碼的地方,可以自己建包),主要是多了幾個地方:
src/main/resources ——存放資源文件的地方;
webapp ——存放xml等配置文件的地方,如Spring的配置文件。
5.瞭解pom.xml配置文件
pom中的主要關係分爲:繼承、依賴和聚合,這三種關係並不是相互獨立的,它們往往是結合在一起使用的。
在創建一個maven項目以後,會在項目的根目錄下生成一個pom.xml的配置文件。
pom.xml文件是Maven進行工作的主要配置文件。Maven在建立項目的時候是基於Maven項目下的pom.xml進行的,我們項目依賴的信息和一些基本信息都是在這個文件裏面定義的。
對於一個最簡單的pom.xml的定義必須包含modelVersion、groupId、artifactId和version這四個元素,當然這其中的元素也是可以從它的父項目中繼承的。
在Maven中,使用groupId、artifactId和version組成groupdId:artifactId:version的形式來唯一確定一個項目。
1)pom的依賴
最爲常見,就是前面說到的倉庫相關的概念,我們依賴一個jar包或工程只需在dependencies節點下添加一個dependency子節點即可~
<dependency><!-- 這是依賴另外一個工程的格式,如果是依賴jar包的話要另外寫--> <groupId>cn.itcast.maven</groupId> <artifactId>HelloFriend</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency>
依賴jar包:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
2)pom的繼承
前面說了pom有點類似oop,我們可以把整個項目理解成一個對象。巧的是,pom也有繼承。
繼承爲了消除重複,我們把很多相同的配置提取出來(比如在maven相互依賴的項目中,不同的項目中卻有相同的jar包配置,那樣不是顯得非常多而且繁瑣,每次都需要去配置它,很麻煩)
所以,maven提供了一個父類maven項目(新建父類工程Parent,目的消除子工程的配置文件中重複的內容)來裝所有公共使用的jar,只要繼承都可以使用。
首先在parent項目的pom.xml配置依賴的公共jar包,然後在各子項目中引入父項目,一般放在<dependencies>節點上面,此時各個子項目就無需在pom.xml中加入公共jar包的依賴,只需添加各自
需要的jar包依賴即可。
<parent> <groupId>cn.itcast.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../Parent/pom.xml</relativePath> </parent>
但此時父項目是一個聚合工程,沒有實際代碼。它的pom.xml的packaging應爲pom。
3)pom的聚合
在開發的過程中,我們常常會有分模塊開發的做法,比如一個工程,有web模塊(直接跟UI交互的模塊),有facade模塊(通過webservice提供給其他項目使用的接口模塊),
service模塊(實現其他項目接口模塊的功能模塊)等等,這些如果不分模塊就會顯得很雜亂,而分了模塊以後層次就會清晰得多。maven對各模塊(實際上也是一個工程)的管理提供了支持,
就是聚合。
在父工程(被聚合對象)中,pom.xml的modules部分定義成如下的樣式:
<groupId>com.web</groupId> <artifactId>maven-web</artifactId> <packaging>pom</packaging> ..... <modules> <module>maven-web-facade</module> <!--各module屬性的值是各模塊的artifactId--> <module>maven-web-service</module> ..... </modules>
而各子模塊,如facade模塊的pom.xml:
<parent> <groupId>com.myhost.myapp</groupId> <artifactId>myapp</artifactId> <version>1.0</version> </parent> <groupId>com.myhost.myapp</groupId> <artifactId>myapp-facade</artifactId> <version>1.0</version> <name>myapp-facade</name>
同理,service模塊的pom.xml:
<parent> <groupId>com.web</groupId> <artifactId>maven-web</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>com.web</groupId> <artifactId>maven-web-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>maven-web-service</name>
爲了直觀感受,建議在eclipse裏建一個working set,把聚合與被聚合的項目放在同一個working set裏。然後eclispe裏的Pacakge Exploer的Top Level Elements倒三角里選“Working Set”,
顯示效果如下: