1.M2_HOME
前面講到設(shè)置M2_HOME環(huán)境變量指向maven的安裝目錄,本書(shū)之后所有使用M2_HOME的地方都指代了該安裝目錄。下面看一下該目錄的結(jié)構(gòu)和內(nèi)容:
該目錄包含了mvn運(yùn)行的腳本,這些腳本用來(lái)配置java命令,準(zhǔn)備好classpath和相關(guān)的java系統(tǒng)屬性,然后執(zhí)行java命令。其中mvn是基于UNIX平臺(tái)的shell腳本,mvn.bat是基于windows平臺(tái)的bat腳本。在命令行輸入任何一條mvn命令時(shí),實(shí)際上就是在調(diào)用這些腳本。該目錄還包含了mvnDebug和mvnDebug.bat兩個(gè)文件,同樣,前者是UNIX平臺(tái)的腳本,后者是windows平臺(tái)的腳本。那么mvn和mvnDebug有什么區(qū)別和關(guān)系呢?打開(kāi)文件我們就可以看到,兩者基本是一樣的,只是mvnDebug多了一條MAVEN_DEBUG_OPTS配置,其作用就是在運(yùn)行Maven時(shí)開(kāi)啟debug,以便調(diào)試Maven本身。此外,該目錄還包含m2.conf文件,這是classworlds的配置文件,后面會(huì)介紹classworlds。
該目錄只包含一個(gè)文件,以maven3為例,該文件為plexus-classworlds-xxx.jar。plexus-classworlds是一個(gè)類(lèi)加載器框架,相對(duì)于默認(rèn)的java類(lèi)加載器,它提供了更豐富的語(yǔ)法以方便配置,maven使用該框架加載自己的類(lèi)庫(kù)。
該目錄包含了一個(gè)非常重要的文件settings.xml。直接修改該文件,就能在機(jī)器上全局地定制maven的行為。一般情況下,我們更偏向于復(fù)制該文件至~/.m2/目錄下(~表示用戶(hù)目錄),然后修改該文件,在用戶(hù)范圍定制maven的行為。后面將會(huì)多次提到settings.xml,并分析其中的各個(gè)元素。
該目錄包含了所有maven運(yùn)行時(shí)需要的java類(lèi)庫(kù),maven本身是分模塊開(kāi)發(fā)的,因此用戶(hù)能看到諸如maven-core-3.0.jar,maven-model-3.0.jar之類(lèi)的文件。此外,這里還包含一些maven用到的第三方依賴(lài),如common-cli-1.2.jar,google-collection-1.0.jar等。對(duì)于maven2來(lái)說(shuō),該目錄只包含一個(gè)如maven-2.2.1-uber.jar的文件,原本各為獨(dú)立jar文件的maven模塊和第三方類(lèi)庫(kù)都被拆解后重新合并到了這個(gè)jar文件中。可以說(shuō),lib目錄就是真正的maven。
2.~/.m2
在用戶(hù)目錄下可以發(fā)現(xiàn).m2文件夾。默認(rèn)情況下,該文件夾下放置了maven本地倉(cāng)庫(kù).m2/repository。所有的maven構(gòu)件都被存儲(chǔ)到該倉(cāng)庫(kù)中,以方便重用。默認(rèn)情況下,~/.m2目錄下除了repository倉(cāng)庫(kù)之外就沒(méi)有其他目錄和文件了,不過(guò)大多數(shù)maven用戶(hù)需要復(fù)制M2_HOME/conf/settings.xml文件到~/.m2/settings.xml,以便定制。
有時(shí)候你所在的公司基于安全因素考慮,要求你使用通過(guò)安全認(rèn)證的代理訪問(wèn)因特網(wǎng)。這種情況下,就需要為Maven配置HTTP代理,才能讓它正常訪問(wèn)外部倉(cāng)庫(kù),以下載所需要的資源。首先確認(rèn)自己無(wú)法直接訪問(wèn)公共的maven中央倉(cāng)庫(kù),直接運(yùn)行命令ping repo1.maven.org可以檢查網(wǎng)絡(luò)。如果真的需要代理,先檢查一下代理服務(wù)器是否暢通。比如現(xiàn)在有一個(gè)IP地址為218.14.227.197,端口為3128的代理服務(wù),我們可以運(yùn)行telnet 218.14.227.197 3128來(lái)檢測(cè)該地址的該端口是否暢通。如果得到出錯(cuò)信息,需要先獲取正確的代理服務(wù)信息,如果telnet連接正確,則輸入ctrl+],然后q,回車(chē),退出即可。
檢查完畢之后,編輯~/.m2/settings.xml文件(如果沒(méi)有該文件,則復(fù)制$M2_HOME/conf/settings.xml)。添加代理配置如下:
這段配置十分簡(jiǎn)單,proxies下可以有多個(gè)proxy元素,如果聲明了多個(gè)proxy元素,則默認(rèn)情況下第一個(gè)被激活的proxy會(huì)生效。這里聲明了一個(gè)id為my-proxy的代理,active的值為true表示激活該代理,protocol表示使用的代理協(xié)議,這里是http。當(dāng)然,最重要的是指定正確的主機(jī)名(host元素)和端口(port元素)。上述xml配置中注釋掉了username,password,nonProxyHosts幾個(gè)元素。當(dāng)代理服務(wù)需要認(rèn)證時(shí),就需要配置username和password。nonProxyHost元素用來(lái)指定哪些主機(jī)不需要代理,可以使用"|"符號(hào)來(lái)分隔多個(gè)主機(jī)名。此外,該配置也支持通配符,如:*.google.com表示所有以google.com結(jié)尾的域名訪問(wèn)都不要通過(guò)代理。
1.工具下載:
Eclipse4.2 jee版本(這里使用最新的Eclipse版本,3.7以上版本按照以下步驟都可以)
下載地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/juno/SR2/eclipse-jee-juno-SR2-win32.zip&mirror_id=1142
Maven3.0.5版本下載地址:
http://maven.apache.org/download.cgi
2.maven配置
maven下載后,需要配置環(huán)境變量,將maven解壓后的bin目錄配置到環(huán)境變量中,如下所示(我這里用的是3.0.4版本。并安裝在D盤(pán)根目錄下):
配置完成,可打開(kāi)命令行,輸入mvn -v,如下圖所示(出現(xiàn)版本信息,即表示配置成功):
設(shè)置maven倉(cāng)庫(kù)位置:

默認(rèn)的maven倉(cāng)庫(kù)位置為:C:\Users\Administrator\.m2(其中Administrator為當(dāng)前賬號(hào))。
3.eclipse安裝maven插件(由于eclipse安裝插件有版本問(wèn)題,所以這里建議eclipse3.7以上版本)。
maven插件下載地址(由于附件超過(guò)10M,所以放到百度網(wǎng)盤(pán)上了):
http://pan.baidu.com/share/link?shareid=370537&uk=3222190371
只需要解壓后,把links、myplugins文件夾放到eclipse安裝目錄下,如下圖所示:

并且修改links下的maven.link文件。指向myplugins目錄即可。我的配置為:
path=D:/work/eclipse/eclipse4.2/myplugins/maven
重啟eclipse(如果eclipse程序之前已啟動(dòng))。
選擇Window-》Preferences-》選擇Maven,如下圖所示:
選擇“Installations”,點(diǎn)擊“Add”添加maven目錄,如下圖所示:
繼續(xù)選擇“User Settings”,配置maven的setting文件,如下圖所示:
這里選擇maven安裝目錄下的conf/settings文件,如下圖所示:
至此,maven插件已經(jīng)安裝完成。
4.查看maven的console:
點(diǎn)擊“Window-》Show View-》Console”,如下圖所示:
此時(shí),eclipse的底部區(qū)域已經(jīng)增加了Console的tab。需要切換到Maven的Console,如下圖所示:

maven 配置
2.7。1 設(shè)置 maven_opts 變量
前面介紹Maven安裝目錄時(shí)我們了解到,運(yùn)行mvn命令實(shí)際上是執(zhí)行了Java命令,既然是運(yùn)行Java,那么運(yùn)行Java命令可用的參數(shù)當(dāng)然也應(yīng)該在運(yùn)行mvn命令時(shí)可用。這個(gè)時(shí)候,MAVEN_OPTS環(huán)境變量就能派上用場(chǎng)。
通常需要設(shè)置MAVEN_OPTS的值為-Xms128m -Xmx512m,因?yàn)镴ava默認(rèn)的最大可用內(nèi)存往往不能夠滿(mǎn)足Maven運(yùn)行的需要,比如在項(xiàng)目較大時(shí),使用Maven生成項(xiàng)目站點(diǎn)需要占用大量的內(nèi)存,如果沒(méi)有該配置,則很容易得到j(luò)ava.lang.OutOfMemeoryError。因此,一開(kāi)始就配置該變量是推薦的做法。
關(guān)于如何設(shè)置環(huán)境變量,請(qǐng)參考前面設(shè)置M2_HOME環(huán)境變量的做法,盡量不要直接修改mvn.bat或者mvn這兩個(gè)Maven執(zhí)行腳本文件。因?yàn)槿绻薷牧四_本文件,升級(jí)Maven時(shí)就不得不再次修改,一來(lái)麻煩,二來(lái)容易忘記。同理,應(yīng)該盡可能地不去修改任何Maven安裝目錄下的文件。
配置setting.xml
maven2 比起maven1 來(lái)說(shuō),需要配置的文件少多了,主要集中在pom.xml和settings.xml中。
先來(lái)說(shuō)說(shuō)settings.xml,settings.xml對(duì)于maven來(lái)說(shuō)相當(dāng)于全局性的配置,用于所有的項(xiàng)目。在maven2中存在兩個(gè) settings.xml,一個(gè)位于maven2的安裝目錄conf下面,作為全局性配置。對(duì)于團(tuán)隊(duì)設(shè)置,保持一致的定義是關(guān)鍵,所以 maven2/conf下面的settings.xml就作為團(tuán)隊(duì)共同的配置文件。保證所有的團(tuán)隊(duì)成員都擁有相同的配置。當(dāng)然對(duì)于每個(gè)成員,都需要特殊的 自定義設(shè)置,如用戶(hù)信息,所以另外一個(gè)settings.xml就作為本地配置。默認(rèn)的位置為:${user.dir} /.m2/settings.xml目錄中(${user.dir} 指windows 中的用戶(hù)目錄)。
settings.xml基本結(jié)構(gòu)如下:
xml 代碼
- <settings 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/settings-1.0.0.xsd">
- <localRepository/>
- <interactiveMode/>
- <usePluginRegistry/>
- <offline/>
- <pluginGroups/>
- <servers/>
- <mirrors/>
- <proxies/>
- <profiles/>
- <activeProfiles/>
- </settings>
簡(jiǎn)單介紹一下幾個(gè)主要的配置因素:localRepository:表示本地庫(kù)的保存位置,也就是maven2主要的jar保存位置,默認(rèn)在${user.dir}/.m2/repository,如果需要另外設(shè)置,就換成其他的路徑。offline:如果不想每次編譯,都去查找遠(yuǎn)程中心庫(kù),那就設(shè)置為true。當(dāng)然前提是你已經(jīng)下載了必須的依賴(lài)包。Servers 在POM中的 distributionManagement元素定義了開(kāi)發(fā)庫(kù)。然而,特定的username和pwd不能使用于pom.xml,所以通過(guò)此配置來(lái)保存server信息 xml 代碼
- <servers>
- <server>
- <id>server001</id>
- <username>my_login</username>
- <password>my_password</password>
- <privateKey>${usr.home}/.ssh/id_dsa</privateKey>
- <passphrase>some_passphrase</passphrase>
- <filePermissions>664</filePermissions>
- <directoryPermissions>775</directoryPermissions>
- <configuration></configuration>
- </server>
- </servers>
- id:server 的id,用于匹配distributionManagement庫(kù)id,比較重要。
- username, password:用于登陸此服務(wù)器的用戶(hù)名和密碼
- privateKey, passphrase:設(shè)置private key,以及passphrase
- filePermissions, directoryPermissions:當(dāng)庫(kù)文件或者目錄創(chuàng)建后,需要使用權(quán)限進(jìn)行訪問(wèn)。參照unix文件許可,如664和775
Mirrors
表示鏡像庫(kù),指定庫(kù)的鏡像,用于增加其他庫(kù)
xml 代碼
- <mirrors>
- <mirror>
- <id>planetmirror.com</id>
- <name>PlanetMirror Australia</name>
- <url>http://downloads.planetmirror.com/pub/maven2</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
- </mirrors>
- id,name:唯一的標(biāo)志,用于區(qū)別鏡像
- url:鏡像的url
- mirrorOf:此鏡像指向的服務(wù)id
Proxies
此設(shè)置,主要用于無(wú)法直接訪問(wèn)中心的庫(kù)用戶(hù)配置。
xml 代碼
- <proxies>
- <proxy>
- <id>myproxy</id>
- <active>true</active>
- <protocol>http</protocol>
- <host>proxy.somewhere.com</host>
- <port>8080</port>
- <username>proxyuser</username>
- <password>somepassword</password>
- <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
- </proxy>
- </proxies>
- id:代理的標(biāo)志
- active:是否激活代理
- protocol, host, port:protocol://host:port 代理
- username, password:用戶(hù)名和密碼
- nonProxyHosts: 不需要代理的host
Profiles
類(lèi)似于pom.xml中的profile元素,主要包括activation,repositories,pluginRepositories 和properties元素
剛開(kāi)始接觸的時(shí)候,可能會(huì)比較迷惑,其實(shí)這是maven2中比較強(qiáng)大的功能。從字面上來(lái)說(shuō),就是個(gè)性配置。
單獨(dú)定義profile后,并不會(huì)生效,需要通過(guò)滿(mǎn)足條件來(lái)激活。
repositories 和pluginRepositories
定義其他開(kāi)發(fā)庫(kù)和插件開(kāi)發(fā)庫(kù)。對(duì)于團(tuán)隊(duì)來(lái)說(shuō),肯定有自己的開(kāi)發(fā)庫(kù)。可以通過(guò)此配置來(lái)定義。
如下的配置,定義了本地開(kāi)發(fā)庫(kù),用于release 發(fā)布。
xml 代碼
- <repositories>
- <repository>
- <id>repo-local</id>
- <name>Internal 開(kāi)發(fā)庫(kù)</name>
- <url>http://192.168.0.2:8082/repo-local</url>
- <releases>
- <enabled>true</enabled>
- <updatePolicy>never</updatePolicy>
- <checksumPolicy>warn</checksumPolicy>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <layout>default</layout>
- </repository>
- </repositories>
- <pluginRepositories>
- <pluginRepository>
- <id>repo-local</id>
- <name>Internal 開(kāi)發(fā)庫(kù)</name>
- <url>http://192.168.0.2:8082/repo-local</url>
- <releases>
- <enabled>true</enabled>
- <updatePolicy>never</updatePolicy>
- <checksumPolicy>warn</checksumPolicy>
- </releases>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <layout>default</layout>
- </pluginRepository>
- </pluginRepositories>
releases, snapshots:每個(gè)產(chǎn)品的版本的Release或者snapshot(注:release和snapshot的區(qū)別,release一般是比較穩(wěn)定的版本,而snapshot基本上不穩(wěn)定,只是作為快照)properties maven 的properties作為placeholder值,如ant的properties。包括以下的5種類(lèi)型值:- env.X,返回當(dāng)前的環(huán)境變量
- project.x:返回pom中定義的元素值,如project.version
- settings.x:返回settings.xml中定義的元素
- java 系統(tǒng)屬性:所有經(jīng)過(guò)java.lang.System.getProperties()返回的值
- x:用戶(hù)自己設(shè)定的值
Activation
用于激活此profile
xml 代碼
- <activation>
- <activeByDefault>false</activeByDefault>
- <jdk>1.5</jdk>
- <os>
- <name>Windows XP</name>
- <family>Windows</family>
- <arch>x86</arch>
- <version>5.1.2600</version>
- </os>
- <property>
- <name>mavenVersion</name>
- <value>2.0.3</value>
- </property>
- <file>
- <exists>${basedir}/file2.properties</exists>
- <missing>${basedir}/file1.properties</missing>
- </file>
- </activation>
- jdk:如果匹配指定的jdk版本,將會(huì)激活
- os:操作系統(tǒng)
- property:如果maven能檢測(cè)到相應(yīng)的屬性
- file: 用于判斷文件是否存在或者不存在
除了使用activation來(lái)激活profile,同樣可以通過(guò)activeProfiles來(lái)激活
Active Profiles
表示激活的profile,通過(guò)profile id來(lái)指定。
xml 代碼
- <activeProfiles>
- <activeProfile>env-test</activeProfile> 指定的profile id
- </activeProfiles>