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