Maven是一個採用純Java編寫的開源項目管理工具, Maven採用了一種被稱之爲Project Object Model (POM)概念來管理項目,全部的項目配置信息都被定義在一個叫作POM.xml的文件中, 經過該文件Maven能夠管理項目的整個生命週期,包括清除、編譯,測試,報告、打包、部署等等。目前Apache下絕大多數項目都已經採用Maven進行管理. 而Maven自己還支持多種插件, 能夠方便更靈活的控制項目, 開發人員的主要任務應該是關注商業邏輯並去實現它, 而不是把時間浪費在學習如何在不一樣的環境中去依賴jar包,項目部署等。Maven正是爲了將開發人員從這些任務中解脫出來而誕生的html
l Jar的聲明式依賴性管理java
l 項目自動構建web
l http://maven.apache.org/download.html 下載最新版本Maven 3.0.2 (Binary zip)apache
l 解壓到 D(自己就是綠色版不須要安裝):api
l 配置環境變量(配置以前,必須肯定配置了JDK環境變量)瀏覽器
MAVEN_HOME : D:\apache-maven-3.0.2
把此命令添加到Path中: %MAVEN_HOME%\bin\緩存
l 配置用戶範圍的settings.xmltomcat
MAVEN_HOME/conf/settings.xml 全局的網絡
~/.m2/settings.xml 單個用戶的oracle
l 驗證安裝是否成功
在命令行上輸入: mvn -version;回車, 如看到下面信息表示安裝成功
l bin:含有mvn運行的腳本
l boot:含有plexus-classworlds類加載器框架
l conf:含有settings.xml配置文件
l lib:含有Maven運行時所須要的java類庫
l Settings.xml 中默認的用戶庫: ${user.home}/.m2/repository
l Maven默認倉庫下載地址在: maven的lib目錄下maven-model-builder-3.0.4.jar的pom.xml中
Convention Over Configuration (約定優於配置)。在現實生活中,有不少常識性的東西,地球人都知道。好比說:如何過馬路(紅燈停綠燈行),如何開門,關門等。對於這些事情,人們已經有了默認的約定, 在軟件開發過程當中,道理也是相似的,若是咱們事先約定好全部項目的目錄結構,標準開發過程(編譯,測試) , 全部人都遵循這個約定。軟件項目的管理就會變得簡單不少。在如今流行的不少框架中,都使用了這個概念
Hello --src -----main ----------java --用來存放Java文件 ----------resources --用來存放資源文件 -----test ---------java --用來存放測試的Java文件 ---------resources --target --項目輸出位置,編譯完畢後自動生成 --pom.xml -- 項目對象模型的描述 ,它是maven配置的核心 |
<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"> <!-- 當前pom的版本號 --> <modelVersion>4.0.0</modelVersion> <!-- groupId: 當前jar所屬的命名空間 --> <groupId>cn.itcast.maven</groupId> <!-- 當前項目模塊名稱 --> <artifactId>Hello</artifactId> <!-- 當前項目的版本, SNAPSHOT鏡像版 --> <version>0.0.1-SNAPSHOT</version> <!-- 當前模塊須要依賴的相關jar包,也稱爲依賴管理, 全部被依賴的包都是經過"座標"定位的 --> <dependencies> <!-- 須要依賴junit 經過 groupId+artifactId+version來查找,若是本地沒有則到中央倉庫下載 --> <dependency> <!-- 當前jar所屬的命名空間 --> <groupId>junit</groupId> <!-- 依賴的項目模塊的名稱 --> <artifactId>junit</artifactId> <!-- 依賴的版本號 --> <version>4.9</version> <!-- 依賴的範圍, 有 test compile privlege --> <scope>test</scope> </dependency> </dependencies> </project> |
pom.xml 文件是maven對一個項目的核心配置,這個文件將包含你但願如何構建項目的大多數配置信息。POM大而複雜,但你不用所有去了解,只要使用一些經常使用的配置就能夠了
l 在src/main/java/cn/itcast/maven目錄下新建文件Hello.java
package cn.itcast.maven; public class Hello { public String sayHello(String name){ return "Hello "+name+"!"; } } |
l 在/src/test/java/cn/itcast/maven目錄下新建測試文件HelloTest.java
package cn.itcast.maven; import org.junit.Test; import static junit.framework.Assert.*; public class HelloTest { @Test public void testHello(){ Hello hello = new Hello(); String results = hello.sayHello("litingwei"); assertEquals("Hello litingwei!",results); } } |
打開cmd命令行, 進入Hello項目根目錄執行mvn compile命令, 查看根目錄變化
cmd 中繼續錄入mvn clean命令,而後再次查看根目錄變化
cmd 中錄入 mvn clean compile命令, 查看根目錄變化
cmd 中錄入 mvn clean test命令,查看根目錄變化
cmd 中錄入 mvn clean package命令,查看根目錄變化
Maven的核心僅僅定義了抽象的生命週期,具體的任務都是交由插件完成的每一個插件都能實現多個功能,每一個功能就是一個插件目標
Maven的生命週期與插件目標相互綁定,以完成某個具體的構建任務, Maven的插件在: .m2\repository\org\apache\maven\plugins
相似在平面幾何中座標(x,y)能夠標識平面中惟一的一點, Maven世界擁有大量構建,咱們須要找一個用來惟一標識一個構建的統一規範
擁有了統一規範,就能夠把查找工做交給機器
l groupId:定義當前Maven項目隸屬項目 (實際對應JAVA的包的結構, 是main目錄裏java的目錄結構)
l artifactId:定義實際項目中的一個模塊(項目的惟一的標識符,實際對應項目的名稱,就是項目根目錄的名稱)
l version:定義當前項目的當前版本
l 何爲Maven倉庫:用來統一存儲全部Maven共享構建的位置就是倉庫
l Maven配置jar包的路徑爲:groupId/artifactId/version/artifactId-version
l 本地倉庫(~/.m2/repository/):每一個用戶只有一個本地倉庫
l 中央倉庫(Maven默認的遠程倉庫):Maven默認的遠程倉庫下載地址爲:http://repo1.maven.org/maven2
l 私服:是一種特殊的遠程倉庫, 它是架設在局域網內的倉庫, 主要是爲了團隊協做開發
l 鏡像:用來替代中央倉庫, 速度通常比中央倉庫快
HelloFriend --src -----main ----------java ----------resources -----test ---------java ---------resources --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>cn.itcast.maven</groupId> <artifactId>HelloFriend</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>cn.itcast.maven</groupId> <artifactId>Hello</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> </dependencies> </project> |
l 在src/main/java/cn/itcast/maven目錄下新建文件HelloFriend.java
package cn.itcast.maven; public class HelloFriend{ public String sayHello(String name){ return "Hello "+name+"!"; } } |
l 在/src/test/java/cn/itcast/maven目錄下新建測試文件HelloFriendTest.java
package cn.itcast.maven; import org.junit.Test; import cn.itcast.maven.Hello; public class HelloFriendTest { @Test public void tesHelloFriend(){ HelloFriend helloFriend = new HelloFriend(); String results = helloFriend.sayHelloToFriend("litingwei"); System.out.println(results); } } |
l 在HelloFriend目錄下執行 mvn clean mvn compile mvn test 都正常
l 在HelloFriend目錄下執行命令mvn package 系統報錯說沒有找到依賴, 由於HelloFriend依賴Hello模塊,可是此模塊在我的倉庫和中央倉庫中並不存在
l 須要從新構建Hello第一個項目並安裝到數據倉庫, 在Hello根目錄下執行mvn clean install, 就會部署的中央倉庫中
l 在MyEclipse建立項目的時候選擇Maven Project
l 在構件嚮導的時候選擇quickstart注意, 此嚮導也是插件,第一次使用的時候.也要從遠程倉庫中下載相應的jar包, 所以須要網絡環境
l 設置當前模塊的座標,和相應的版本號
l 建立完畢後默認生成的項目包目錄以下
l 經過在pom.xml中配置相應Hello.jar便可
<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>Hello3</groupId> <artifactId>Hello3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <!-- 當前Maven模塊的相關信息,可選信息 --> <name>Hello3</name> <url>http://maven.apache.org</url> <!-- 設置常量, 下面能夠經過${project.build.sourceEncoding}來引用,通常來講版本號設置在此處 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 依賴管理 --> <dependencies> <!-- 依賴Junit--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <!-- 依賴前面的Hello, 那麼在倉庫中必須擁有 Hello的座標 --> <dependency> <groupId>cn.itcast.maven</groupId> <artifactId>Hello</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> </project> |
l 經過在pom.xml中單擊右鍵選擇相應的命令便可
l 選擇建立一個普通的web工程
l 設置相應的座標
l 若是採用src缺省的包結構,則pom.xm中須要指定編譯和調試的目錄.
<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>web</groupId> <artifactId>web</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <!-- 配置常量 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <jstl.version>1.2</jstl.version> <compiler.version>1.6</compiler.version> </properties> <!-- 定義依賴管理 --> <dependencies> <!-- 定義須要依賴的系統jar, provided則在打包的時候不會包含 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <!-- 定義依賴的第三方包,compile 則打包的時候會自動加載到lib目錄中 --> <dependency> <groupId>cn.itcast.maven</groupId> <artifactId>Hello</artifactId> <version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> </dependencies> <!-- 用來定義構建階段的標籤 --> <build> <!-- 因爲採用的非Maven的約定,則在構建的時候要指定的目錄 --> <sourceDirectory>${basedir}/src</sourceDirectory> <outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory> <resources> <!-- 資源文件也存放到src中但排除 *.java --> <resource> <directory>${basedir}/src</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> </resources> <plugins> <!-- 配置相應的打包插件 --> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <webappDirectory>${basedir}/WebRoot</webappDirectory> <warSourceDirectory>${basedir}/WebRoot</warSourceDirectory> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${compiler.version}</source> <target>${compiler.version}</target> </configuration> </plugin> </plugins> </build> </project> |
l 在index.jsp頁面中添加以下代碼
<body> <% // 要導入相應: cn.itcast.maven.* Hello hello=new Hello(); out.println(hello.sayHello("admin")); %> </body> |
l 地址: 目前來講: http://repo1.maven.org/maven2/是真正的Maven中央倉庫的地址,該地址內置在Maven的源碼中其餘的都是鏡像
l 索引: 中央倉庫帶有索引文件以方便用戶對其進行搜索,完整的索引文件大小約爲60M,索引每週更新一次
l 黑名單: 若是某個IP地址惡意的下載中央倉庫內容,例如全公司100臺機器使用同一個IP反覆下載,這個IP(甚至是IP段)會進入黑名單,所以稍有規模的使用Maven時,應該用Nexus架設私服
爲何要搭建nexus私服,緣由很簡單,有些公司都不提供外網給項目組人員,所以就不能使用maven訪問遠程的倉庫地址,因此頗有必要在局域網裏找一臺有外網權限的機器,搭建nexus私服,而後開發人員連到這臺私服上,這樣的話就能夠經過這臺搭建了nexus私服的電腦訪問maven的遠程倉庫
第一步:下載nexus-webapp-1.9.2.4.war包,而後拷貝到tomcat下的webapps目錄中
第二步:啓動tomcat 默認登陸帳戶密碼爲: admin admin123
第三步:訪問http://localhost:8080/項目名稱/
Nexus倉庫的默認的地址, nexus-2.1.2\WEB-INF\plexus.properties 中定義的
在Views/Repositories-->Repositories裏進行配置, nexus裏能夠配置3種類型的倉庫,分別是proxy、hosted、group
proxy:是遠程倉庫的代理。好比說在nexus中配置了一個central repository的proxy,當用戶向這個proxy請求一個artifact,這個proxy就會先在本地查找,若是找不到的話,就會從遠程倉庫下載,而後返回給用戶,至關於起到一箇中轉的做用
Hosted:是宿主倉庫,用戶能夠把本身的一些構件,deploy到hosted中,也能夠手工上傳構件到hosted裏。好比說oracle的驅動程序,ojdbc6.jar,在central repository是獲取不到的,就須要手工上傳到hosted裏
Group:是倉庫組,在maven裏沒有這個概念,是nexus特有的。目的是將上述多個倉庫聚合,對用戶暴露統一的地址,這樣用戶就不須要在pom中配置多個地址,只要統一配置group的地址就能夠了右邊那個Repository Path能夠點擊進去,看到倉庫中artifact列表。不過要注意瀏覽器緩存。我今天就發現,明明構件已經更新了,在瀏覽器裏卻看不到,還覺得是BUG,實際上是被瀏覽器緩存了
virtual:也是中央倉庫鏡像,支持M1老版本
3rd party: 沒法從公共倉庫得到的第三方發佈版本的構件倉庫 |
最關鍵的一個配置, 就是Central Repository的proxy配置,由於大部分的構件,都是要經過這個proxy獲得的,
通常會配置3個hosted repository, 分別是3rd party、Snapshots、Releases,分別用來保存第三方jar(典型的好比ojdbc6.jar),項目組內部的快照、項目組內部的發佈版, 這裏並無什麼特別的配置,只是Deployment Policy這個選項,通常Snapshots會配置成容許,而Releases和3rd party會設置爲禁止
前面說過group實際上是一個虛擬的倉庫, 經過對實體倉庫(proxy、hosted)進行聚合, 對外暴露一個統一的地址這裏要注意的是,放到左邊的倉庫,纔是會被聚合的倉庫
l 能夠在支持Maven的項目中進行以下配置
<repositories> <repository> <id>shop</id> <name>倉庫介紹</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>plugin</id> <name>插件下載地址</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url> </pluginRepository> </pluginRepositories> |
l 也能夠把地址配置在setting.xml的<profiles>標籤中這樣對全部項目都生效
<profiles> <repositories> <repository> <id>shop</id> <name>倉庫介紹</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>plugin</id> <name>插件下載地址</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profiles> |
l 把本地項目提交到私服中
<distributionManagement> <repository> <!-- 要在我的的setting.xml中配置上傳的密碼 --> <id>snapshots</id> <name>snapshots 測試版</name> <!-- nexus中查找相應的地址--> <url>http://localhost:8080/nexus/content/repositories /snapshots/</url> </repository> </distributionManagement>
<servers> <!-- 在.m2\setting.xml中 配置了要上傳倉庫的密碼 --> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server> <server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> </servers> |
你可能想要配置 Maven 使其徹底跳過單元測試。 可能你有一個很大的系統,單元測試須要花好多分鐘來完成,而你不想在生成最終輸出前等單元測試完成。 你可能正工做在一個遺留系統上面,這個系統有一系列的失敗的單元測試,你可能僅僅想要生成一個 JAR 而不是去修復全部的單元測試。 Maven 提供了跳過單元測試的能力
l 採用命令的方式跳過單元測試
$ mvn install -D maven.test.skip=true
l 採用配置的方式跳過單元測試
surefire 插件用來在maven構建生命週期的test 的插件, 若是每次都不須要運行test則經過簡單的配置便可
<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.7.1</version> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> |
Archetype能夠幫助咱們迅速地構建起項目的骨架,在前面的例子中,咱們徹底能夠在Archetype生成的骨架的基礎上開發Hello World項目以節省大量時間,若是沒有制定packageName則默認與goupId相同
mvn archetype:create -D groupId=com.test.maven -D artifactId=test1 -D packageName=a.b.c |