一、基本概念

1.Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

2.Maven中使用约定,约定java源代码代码必须放在哪个目录下,编译好的java代码又必须放到哪个目录下,这些目录都有明确的约定

3.Maven的每一个动作都拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程

4.只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮我们处理其他事情

5.使用Maven可以进行项目高度自动化构建,依赖管理(这是使用Maven最大的好处),仓库管理

6.根据Maven坐标定义每个构建在仓库中唯一存储路径,大致为:groupId/artifactId/version/artifactId-version.packaging

二、maven插件

1. 概念
1)Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成

2)例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标。例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码
2. Maven插件目标的调用方式
1)将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已

    (1)例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标

2)直接在命令行指定要执行的插件目标

    (1)例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关
3. Maven官方插件列表
1)第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html

2)第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html
4. 常用maven插件
1)maven-archetype-plugin        Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手

2)maven-assembly-plugin         制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等

3)maven-dependency-plugin       帮助分析项目依赖

4)maven-release-plugin          帮助自动化项目版本发布,它依赖于POM中的SCM信息       

5)maven-resources-plugin        为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件

6)jetty-maven-plugin            为了帮助开发者节省时间,jetty-maven-plugin应运而生,它完全兼容 Maven项目的目录结构,能够周期性地检查源文件,一旦发现变更后自动更新到内置的Jetty Web容器中

7)tomcat-maven-plugin           利用tomcat-maven-plugin插件将项目自动打包并部署到tomcat中

三、项目构建过程

1. 项目构建过程:
【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】,这六个步骤就是一个项目的完整构建过程
2. maven的生命周期

Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,初学者容易将Maven的生命周期看成一个整体,其实不然。这三套生命周期分别是

1)clean :在进行真正的构建之前进行一些清理工作
(1)pre-clean  执行一些需要在clean之前完成的工作

 (2)clean  	移除所有上一次构建生成的文件

 (3)post-clean  执行一些需要在clean之后立刻完成的工作
2) default :构建的核心部分,编译,测试,打包,部署等等
validate                        验证工程是否正确,所有需要的资源是否可用
generate-sources
process-sources
generate-resources
process-resources             	复制并处理资源文件,至目标目录,准备打包。
compile                       	编译项目的源代码
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources      	复制并处理资源文件,至目标测试目录。
test-compile                    编译测试源代码
process-test-classes
test                            使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署
prepare-package
package                         接受编译好的代码,打包成可发布的格式,如 JAR
pre-integration-test
integration-test
post-integration-test
verify                          运行所有检查,验证包是否有效且达到质量标准
install                         将包安装至本地仓库,以让其它项目依赖
deploy                          将最终的包复制到远程的仓库,以让其它开发人员与项目共享

注意:运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。
   	  此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要
3)site :生成项目报告,站点,发布站点
(1)pre-site:生成项目站点之前需要完成的工作

 (2)site:生成项目站点文档

 (3)post-site:生成项目站点之后需要完成的工作

 (4)site-deploy:将项目站点发布到服务器
3.常用命令
1)创建Maven的普通java项目:  	mvn archetype:create -DgroupId=packageName -DartifactId=projectName 

2)创建Maven的Web项目:       	mvn archetype:create -DgroupId=packageName -DartifactId=webappName -DarchetypeArtifactId=maven-archetype-webapp 

3)编译源代码:           		mvn compile

4)编译测试代码:          		mvn test-compile   

5)运行测试:                  	mvn test 

6)打包:              			mvn package

7)在本地Repository中安装jar:	mvn install

8)清除产生的项目:          	mvn clean

9)生成eclipse项目:          	mvn eclipse:eclipse

10)组合使用goal命令,如只打包不测试:mvn -Dtest package 

11)只打jar包:               	mvn jar:jar 

12)发布项目到                  mvn deploy     

13)启动tomcat容器          	mvn tomcat7:run
4. Maven项目的目录约定
MavenProjectRoot(项目根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件(web项目就会在下面有webapp目录)
   |     |----test
   |     |         |----java ——存放所有测试.java文件,如JUnit测试类
   |     |         |----resources ——存放项目资源文件,如spring, hibernate配置文件
   |----target ——项目输出位置
   |----pom.xml ----用于标识该项目是一个Maven项目

四、settings.xml文件配置

1. settings.xml存在于两个地方:
1) 安装的地方:$M2_HOME/conf/settings.xml

2) 用户的目录:${user.home}/.m2/settings.xml

前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml优先
如果偶尔需要创建用户范围的settings,可以简单的copy Maven安装路径下的settings到目录${user.home}/.m2
2. settings下的顶层元素概览
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
            http://maven.apache.org/xsd/settings-1.0.0.xsd">

        <localRepository/>     	这个值是构建系统的本地仓库的路径。默认的值是${user.home}/.m2/repository
        <interactiveMode/>    	如果Maven要试图与用户交互来得到输入就设置为true,否则就设置为false,默认为true
        <usePluginRegistry/> 	如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false
        <offline/>              如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的
        <pluginGroups/>       	插件组
        <servers/>              服务器
        <mirrors/>              镜像
        <proxies/>              代理
        <profiles/>             配置文件
        <activeProfiles/>       激活配置

</settings>
3. 重要元素说明
1)pluginGroup
(1) <pluginGroups>
               <pluginGroup>org.mortbay.jetty</pluginGroup>
      </pluginGroups>

(2)这个元素包含了一系列pluginGroup元素,每个又包含了一个groupId

(3)当一个plugin被使用,而它的groupId没有被提供的时候,这个列表将被搜索。这个列表自动的包含了org.apache.maven.plugins和org.codehaus.mojo

(4)例如,有了上面的配置,Maven命令行可以使用简单的命令执行org.morbay.jetty:jetty-maven-plugin:run,如:mvn jetty run
2)servers
(1) <servers>
        <server>
            <id>server001</id>            				这是Server的ID(不是登录进来的user),与Maven想要连接上的repository/mirror中的id元素相匹配
            <username>my_login</username>        		username,password:这两个元素成对出现,表示连接这个server需要验证username和password
            <password>my_password</password>
            <privateKey>${user.home}/.ssh/id_dsa</privateKey>
            <passphrase>some_passphrase</passphrase>
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
            <configuration></configuration>
        </server>
    </servers>
3)mirrors(加快网速,给远程仓库制造一个镜像)
(1) <mirrors>   
        <mirror>
            <id>planetmirror.com</id>        id,name:唯一的镜像标识和用户友好的镜像名称。id被用来区分mirror元素,并且当连接时候被用来获得相应的证书
            <name>PlanetMirror Australia</name>
            <url>http://downloads.planetmirror.com/pub/maven2</url>       url:镜像基本的URL,构建系统敬将使用这个URL来连接仓库,而不是原来的仓库URL
            <mirrorOf>central</mirrorOf>        是要替代的仓库的id
        </mirror>
    </mirrors>
4)proxies
(1) <proxies>
        <proxy>
            <id>myproxy</id>        				id:proxy的唯一标识,用来区别proxy元素
            <active>true</active>        			active:当proxy被激活的时候为true
            <protocol>http</protocol>    			protocol,host,port:代理地址protocol://host:port的分散形式
            <host>proxy.somewhere.com</host>
            <port>8080</port>
            <username>proxyuser</username>    		username,password:两个元素成对出现,提供连接proxy服务器时的认证
            <password>somepassword</password>
            <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>    这里列出了不需要使用代理的hosts
        </proxy>
    </proxies>
5) profiles
(1) <profiles>
        <profile>
            <id>test</id>
            <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>
            ...
        </profile>
    </profiles>
    
(2) settings.xml中的profile是pom.xml中的profile的简洁形式

(3) 它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素

(4) profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置

(5) 如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles

(6) 如果所有指定的条件都达到了,那么,activation就被触发,而且不需要一次性全部达到

(7) properties

    <profiles>
        <profile>
                ...
                <properties>
                    <user.install>${user.home}/our-project</user.install>
                 </properties>
                 ...
        </profile>
    </profiles>      //  如果这个profile被激活,那么属性${user.install}就可以被访问了

(8) repositories

    <repositories>
        <repository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>libs-release</name>
            <url>http://113.105.74.141:8081/artifactory/libs-release</url>
        </repository>
        <repository>
            <snapshots />
            <id>snapshots</id>
            <name>libs-snapshot</name>
            <url>http://113.105.74.141:8081/artifactory/libs-snapshot</url>
        </repository>
    </repositories>

(9) plugin repositories

    <pluginRepositories>
        <pluginRepository>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <id>central</id>
            <name>plugins-release</name>
            <url>http://repo1.maven.org/maven2</url>
        </pluginRepository>
        <pluginRepository>
            <snapshots />
            <id>snapshots</id>
            <name>plugins-snapshot</name>
            <url>http://113.105.74.141:8081/artifactory/plugins-snapshot</url>
        </pluginRepository>
    </pluginRepositories>
6) activeProfiles
(1) <activeProfiles>
        <activeProfile>env-test</activeProfile>
    </activeProfiles>

(2) 任何profile id被定义到activeProfile的profile将被激活,不管其他的环境设置怎么样。如果没有匹配的profile被找到,那么就什么事情也不做

参考网址

Maven2的配置文件settings.xml

Maven的生命周期

孤傲苍狼的maven系列博客

maven常用插件解析

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激