使用:html
第一步:項目團隊開發,必定要先更新公共模塊,對依賴進行maven clean(本地清理)、 java clean(編譯) 、maven install(安裝到本地倉庫)java
第二步:maven clean(本地清理)、maven updateSnapshot(從本地倉庫獲取公共模塊的最新快照)、java clean(編譯)、maven install(安裝到本地倉庫)mysql
Maven的pom.xml文件可分紅四部分:web
項目基本信息部分、依賴配置部分、構建環境部分、構建設置、其餘擴展部分sql
其餘擴展部分有:apache
repositories中央倉庫配置,按順序進行windows
distributionManagement,發佈提交配置安全
profiles主要用戶重點研究 服務器
Maven主要思想是以生命週期爲主線,在每一個階段完成各個目標。Maven一個插件對應多個目標,在每一個階段都是有插件對應的目標進行工做的。併發
舉例來講:就像是一個角色(插件)有多我的(目標),一個任務(生命週期)須要多個角色(插件和插件的目標)配合而完成。Maven這種安排工做的方法是面向對象的。另外,Maven在POM配置文件中重點描述的是要達成的目的而非過程。
Maven的POM文件繼承和依賴的繼承以及對依賴版本號的統一管理思想也是面向對象的。(這裏有幾個概念,超級POM、多模塊管理parent、在pom中經過定義全局參數統一管理版本號)
超級POM中定義了項目結構的約定,項目生命週期各個階段的默認插件和目標。
本地maven私服配置和使用
maven私服配置:
一、下載nexus組件,驅動該組件,在web頁面正確配置hosted、proxy、group信息,主要是proxy用來指明代理的倉庫地址設置proxy更新本地索引,hosted用來指明第三方插件
二、設置用戶名和密碼
三、查看插件中央服務的倉庫sonatype-work\nexus\storage
maven私服使用:兩個位置,一個是pom.xml配置,另外一個是setting文件配置
setting文件配置
服務器安全權限:
<id>my-nexus-releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>my-nexus-snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
下載地址列表
<mirror>
<id>nexus</id>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
部署到遠程服務器的地址
<profile>
<repository>
<id>central</id>
<name>central</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</profile>
<!-- 執行:$ mvn release:prepare 命令時會打包併發布到該倉庫。 -->
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>
</repository>
</repositories>
</profile>
<!-- 執行:$ mvn deploy 命令時會打包併發布到該倉庫。 -->
<profile>
<id>nexus-snapshots</id>
<repositories>
<repository>
<id>nexus-snapshots</id>
<name>local private nexus snapshots</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public-snapshots</url>
</repository>
</repositories>
</profile>
激活部署配置
<activeProfile>central</activeProfile>
<activeProfile>nexus</activeProfile>
<activeProfile>nexus-snapshots</activeProfile>
pom.xml文件配置
倉庫地址
<repositories>
<repository>
<id>nexus</id>
<name>my-nexus-repository</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
構建發佈地址
<distributionManagement>
<repository>
<id>my-nexus-releases</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>my-nexus-snapshot</id>
<url>http://127.0.0.1:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
Maven的使用方式有繼承和多模塊組合管理兩種:組合是面向對象管理,繼承是面向資源和行爲的繼承
一、繼承採用parent關鍵字,在子項目中直接採用parent關鍵字指明父項目的groupid,子項目將繼承父項目pom中的全部依賴。可經過依賴管理實現對依賴的統一管理(頂層pom定義依賴管理的版本號,子模塊定義依賴,版本號來源於父pom)
二、多模塊組合管理採用pom格式,從上向下看就是一種管理上的策略,定義pom管理模塊中須要定義子模塊<modules>列表,子模塊之間能夠相互依賴。構建頂級pom時會對全部子模塊進行構建。
對maven繼承和組合的應用:
若是一個項目小組有本身的類庫,能夠經過定義一個頂級POM,讓全部的子模塊進行經過繼承實現以來管理,能夠繼承父POM定義的生命週期
若是多個項目模塊須要每一個子模塊獨立定義本身的依賴和生命週期,同時他們本身能夠互相依賴,構建頂級POM會對全部的子模塊進行構建。
模塊中引用pom依賴,使用方法是將某一類依賴定義到一個pom文件中去,而後在模塊中引用這個pom文件做爲依賴。
Maven是經過pom文件和插件進行工做的。
Maven是用來管理依賴,項目編譯、測試、打包、發佈、的工具
Maven能夠將編譯好的jar更新到本地庫,本地其餘項目若是涉及到jar的引用,能夠直接獲得最新的jar引用。
Maven能夠從本地私服中獲取公共jar信息,能夠講本地jar提交到私服中供項目組人員使用。
Maven會自動管理依賴的依賴。
Maven能夠實現項目的模塊化管理,經過parent關鍵字可實現。
1)建立一個maven項目
mvn archetype:create
-DgroupId=org.sonatype.mavenbook.ch03
-DartifactId=simple
-DpackageName=org.sonatype.mavenbook
相關解釋說明
mvn archetype:create 經過archetype插件快速建立一個項目
-Dname=value 這樣的對是將會被傳到目標中的參數,java用來設置系統屬性的方式
artifactId 項目的基礎目錄(simple)
simple項目下的pom.xml文件 描述了項目,配置了插件,聲明瞭依賴
src/main/java java類文件
src/main/resources classpath資源文件
src/test/java 測試java類文件
src/test/resources 測試classpath資源文件
(2)構建並打包項目(在包含pom.xml文件下運行)
mvn install
運行後在target目錄下生成simple-1.0-SNAPSHOT.jar文件(名稱根據pom.xml文件配置得來),
並安裝到咱們的本地maven倉庫。
(3)maven的pom.xml文件說明:
<groupId>org.sonatype.maven.test</groupId> <artifactId>simple</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
以上四個元素是maven的座標,惟一標識了一個項目。
<name>simple</name> <url>http://maven.apache.org</url>
以上二個元素是pom提供的描述性元素,給人提供可閱讀的名字。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
<dependencies>元素定義了項目的相關依賴,
<scope>元素爲test,說明只有在運行compiler:testCompile和surefire:test時纔會被加到classpath中。
<scope>元素若是爲provided,則依賴在編譯的時候須要,可是不該該被捆綁在構建的輸出中。
在開發web應用時頗有用。
maven支持傳遞性依賴,會隱式地把相關依賴間接依賴的包也加到項目中。
(4)驗證程序是否工做(java -cp 指定類運行所依賴其餘類的路徑,多個依賴包用;隔開)
java -cp target/simple-1.0-SNAPSHOT.jar org.sonatype.maven.App
(5)-查看有效的(effective)pom,即maven真正運行根據的pom
mvn help:effective-pom (在項目的基礎目錄下simple運行)
(6)maven項目打包
mvn package 運行到打包爲止的全部階段,包含如下一系列插件目標
mvn resources:resources
compiler:compile
resources:testResources
compiler:testCompile
surefire:test
jar:jar
(7)瀏覽maven中央倉庫
http://repo2.maven.org/maven2
maven倉庫的目錄存儲格式
<groupId> / <artifactId> / <version> / <artifactId>-<version>.<packaging>
(8)生成站點文檔和報告
mvn site (生成文檔目錄在target/site目錄下)
(9)查看相關依賴的groupId和artifactId
http://mvnrepository.com/ (搜索依賴可查看pom.xml文件中的依賴元素)
(10)瀏覽項目的相關依賴(打印出已解決依賴的列表)
1.mvn dependency:resolve(在項目目錄下執行)
2.mvn dependency:tree (瀏覽項目的整個依賴樹,包含間接依賴)
(11)執行單元測試
mvn test
1.忽略單元測試失敗,須要設置Surefire的testFailureIgnore的屬性爲true
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <testFailureIgnore>true<testFailureIgnore> </configuration> <plugin> </plugins> </build>
2.跳過單元測試,須要設置Surefire的skip的屬性爲true
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
(12)建立Maven的Web應用(需指定archetypeArtifactId爲maven-archetype-webapp,打包成war)
mvn archetype:create
-DgroupId=org.sonatype.mavenbook.ch05
-DartifactId=simple-webapp
-DpackageName=org.sonatype.mavenbook
-DarchetypeArtifactId=maven-archetype-webapp
打包的War文件默認名稱爲<artifactId>-<version>.war
若是定義了finalName,則包名爲<finalName>.war.
如:<finalName>simple-webapp</finalName>
(13)配置Maven Jetty插件
1.在pom.xml文件中配置
<build> <finalName>simple-webapp</finalName> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> </plugin> </plugins> </build>
2.啓動Web項目(調用Jetty插件的run目標)
mvn jetty:run
啓動完後就能夠經過(http://localhost:8080/simple-webapp/)訪問。
(14)Pom相關
1.asm包(字節碼操做)依賴包若是版本不一致,則項目會出問題。
2.全部的pom文件都從超級pom繼承,超級pom存放於
{M2_HOME}\lib\maven-2.2.1-uber.jar\org\apache\maven\project
3.查看項目的有效POM,超級POM和項目POM的合併(打印出XML文檔)
mvn help:effective-pom
4.版本號格式(例:1.3.5, 1.3-beta-01)
<主版本>.<次版本>.<增量版本>-<限定版本>
5.pom的屬性引用(${})
例:${project.groupId}-${project.artifactId}
maven提供了三個隱式的變量
1.env 例:${env.PATH},暴露了操做系統,訪問系統的環境變量
2.project 例:${project.groupId},暴露了POM,訪問POM的信息。
3.settings 例:${settings.offline},暴露了Maven Settings的信息,
引用settings.xml文件中offline元素的值。
(15)項目依賴的依賴範圍
1.compile(編譯範圍),默認的範圍,在全部的classpath中可用,同時也會被打包。
2.provided(已提供範圍),只有在容器提供該依賴後纔可以使用,在編譯時可用,但不會被打包。(例:Servlet Api)
3.runtime(運行時範圍),只有在運行和測試系統時須要,編譯時不須要。(例:JDBC驅動)
4.test(測試範圍),只有在測試編譯和測試運行階段可用,編譯和運行時不須要。
5.system(系統範圍),與provided相似,必須顯示的提供一個對於本地系統中JAR文件的路徑。不推薦使用。
6.使用依賴的多個版本
(,) 不包含量詞
[,] 包含量詞
例:<version>[3.8,4.0]</version> 依賴於3.8-4.0之間的版本
<version>[,3.8.1]</version> 依賴於<=3.8.1的版本
7排除傳遞性依賴(配置exclusions元素)
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> </exclusions> </dependency>
8.統一依賴版本號
在子項目中引用依賴而不用顯示的列出版本號(dependencyManagement元素),
版本升級時不用手工的一個個修改依賴的pom.xml文件。
<dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.2</version> </dependency> </dependencies> </dependencyManagement>
在子項目中引用依賴,不用指定版本號
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
若是子項目中指定了版本,將覆蓋頂層POM的dependencyManagement元素的版本號。
9.多模塊項目管理
將不少項目歸類在一塊兒,成爲一個構建,打包類型老是POM.
<modules> <module>sub-gooup-a</module> <module>sub-gooup-b</module> </modules>
10.項目繼承(當一個項目聲明一個parent的時候,它從父項目的POM中繼承信息)
<parent> <groupId>com.training.killerapp</groupId> <artifactId>a-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent>
(16).maven生命週期
(1)清理生命週期(刪除整個構建目錄,target目錄)
mvn clean
(2)默認生命週期階段
1.validate 驗證項目是否正確
2.generate-sources 生成全部須要包含在編譯過程當中的源代碼
3.process-sources 處理源代碼,好比過濾一些值。
4.generate-resources 生成全部須要包含在打包過程當中的資源文件
5.process-resources 複製並處理資源文件至目標目錄,準備打包
6.compile 編譯項目的源代碼
7.process-classes 後處理編譯生成的文件,例如對Java類進行字節碼加強
8.generate-test-sources 生成全部包含在測試編譯過程當中的測試源碼
9.process-test-sources 處理測試源碼,好比過濾一些值
10.generate-test-resources 生成測試須要的資源文件
11.process-test-resources 複製並處理測試資源文件至測試目標目錄
12.test-compile 編譯測試源碼至目標目錄
13.test 使用合適的單元測試框架運行測試。這些測試應該不須要代碼被打包或發佈
14.prepare-package 在真正的打包以前,執行一些準備打包必要的操做。
這一般會產生一個包的展開的處理過的版本
15.package 將編譯好的代碼打包成可分發的格式 ,如JAR,WAR,或者EAR
16.pre-integration-test 執行一些在集成測試運行以前須要的動做。如創建集成測試須要的環境
17.integration-test 若是有必要的話,處理包併發布至集成測試能夠運行的環境
18.post-integration-test 執行一些在集成測試運行以後須要的動做。如清理集成測試環境
19.verify 執行全部檢查,驗證包是有效的,符合質量規範
20.install 安裝包至本地倉庫,以備本地的其它項目做爲依賴使用
21.deploy 複製最終的包至遠程倉庫,共享給其它開發人員和項目(一般和一次正式的發佈相關)
(17).過濾資源,替換屬性
默認的Maven行爲會跳過過濾,只是將資源複製到輸出目錄。需顯示地配置資源過濾
<build> <filters> <filter>src/main/filters/default.properties</filter> </filters> <rosources> <directory>src/main/resources</directory> <filtering>true</filtering> </resources> </build>
(18).使用Maven Profile覆蓋Compiler插件配置
<profiles> <profile> <id>production</id> <build> <plugins> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <debug>false</debug> <optimize>true</optimize> </configuration> </plugin> </plugins> </build> </profile> </profiles>
1.profiles一般是pom.xml中最後一個元素
2.每一個profile必需要有一個id元素,經過傳給Maven一個-P<profile_id>參數來調用profile.
3.一個profile元素能夠包含不少其它元素,只要這些元素能夠出如今pom.xml文件的project元素下。
4.mvn clean install -Pproduction -X (-X爲開啓調試輸出)
(19).使用profile激活動態包含子模塊
<profiles> <profile> <id>jdk16</id> <activation> <jdk>1.6</jdk> </activation> <modules> <module>simple-script</module> </modules> </profile> </profiles>
1.若是在jdk1.6下運行,則會構建simple-script項目,不然不會構建。
2.activation元素列出了全部激活profile須要的條件。
其它方式:經過屬性缺失激活(!表示否認,當沒有設置${environment.type}屬性時被激活.
<activation> <property> <name>!environment.type</name> </property> </activation>
3.若是大量使用Maven Profile,可將profile從POM文件中分離,
使用一個單獨文件,名字爲profiles.xml,放到項目目錄下(同pom.xml),格式爲
<profiles> <profile> ... </profile> </profiles>
4.setting profile能夠應用到全部使用到Maven構建的項目,能夠在兩個地方定義
(1).~/.m2/settings.xml(特定用戶)
(2).${M2_HOME}/conf/settings.xml(全局)
5.列出活動的profile
mvn help:active-profiles
(20).建立私服
下載nexus(http://nexus.sonatype.org/downloads/)
解壓後運行目錄下\bin\jsw\windows-x86-32\Nexus.bat,
訪問http://127.0.0.1:8081/nexus(默認admin,admin123)
1.配置maven settings
<mirrors> <mirror> <id>Nexus</id> <mirrorOf>central</mirrorOf> <name>Nexus Public Mirror</name> <url>http://localhost:8081/nexus/content/groups/public</url> </mirror> </mirrors>
2.或者
<profiles> <profile> <id>artifactory</id> <repositories> <repository> <id>nexus</id> <name>local nexus</name> <url>http://localhost:8081/nexus/content/groups/public</url> <layout>default</layout> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>local nexus</name> <url>http://localhost:8081/nexus/content/groups/public</url> <layout>default</layout> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>artifactory</activeProfile> </activeProfiles>
3. 或者在項目pom.xml中加入
<repositories> <repository> <id>nexus</id> <name>local nexus</name> <url>http://localhost:8081/nexus/content/groups/public</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>nexus</id> <name>local nexus</name> <url>http://localhost:8081/nexus/content/groups/public</url> </pluginRepository> </pluginRepositories>
配置後maven會從本地的nexus安裝查閱(可在Public Repositories和Maven Central倉庫中查到) (21)部署第三方構件到nexus 在nexus項目管理中 找到Repositories,這裏選擇其中一個,例如3rd party, 能夠在下面看到一個Artifact Upload選項卡。 打開在GAV Definition中選擇GAV Parameters,在接下來的Group中選輸入組織名, Artifact項輸入artifactId ,Packaging:這裏選擇jar, 以後上傳一個自定義的jar文件, 點擊Add Artifact,Upload Artifact(s),上傳成功後, 在上邊的3rd party上單擊右鍵——ReIndex,而後刷新下這個列表, 就能夠看到下邊多了.index文件夾和咱們剛纔上傳相關的文件夾。