本博目录:
很早就在项目中接触过Maven,但对Maven没有很深入的了解,犹如《西游记》中五庄观偷吃人参果的猪悟能,囫囵吞食,不知其味。在拜读了《Maven 实战》之后,对Maven有了一定的了解,特记录一些知识如下。
Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven作为跨平台的项目管理工具,最重要的用途—->”服务于构建”,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告、再到打包和部署。
Maven的安装教程,自己可百度安装即可,在这就不赘述了。apache-maven-3.1.0/conf目录中有一个settings.xml文件,我们来剖析下Maven配置文件settings.xml,内容如下代码:
<settings
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"
xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<localRepository>C:\chao\repositorylocalRepository>
<servers>
<server>
<id>nexus-snapshotsid>
<username>swcusername>
<password>swc123password>
server>
<server>
<id>nexus-releasesid>
<username>swcusername>
<password>swc123password>
server>
<server>
<id>tomcat7id>
<username>swcusername>
<password>swcpassword>
server>
<mirrors>
<mirror>
<id>nexusid>
<mirrorOf>*mirrorOf>
<name>internal nexus repositoryname>
<url>http://loaclhost:8081/nexus/content/groups/public/url>
mirror>
mirrors>
<proxies>
<proxy>
<id>petrochinaid>
<active>trueactive>
<protocol>httpprotocol>
<host>10.22.96.29host>
<port>8080port>
<nonProxyHosts>10.*|*.com|*.cnpc|*.localnonProxyHosts>
proxy>
proxies>
settings>
(附:Maven安装包下载地址:http://pan.baidu.com/s/1qYG8jEk)
Maven项目中默认的主代码目录是src/main/java,默认的测试代码目录是src/test/java,任何一个maven项目都需要定义自己的坐标,当这个maven项目作为其他maven项目的依赖时,这组坐标就体现了其价值,。
Maven定义了这样一组规则:世界上任何一个构件(任何一个依赖、插件或者项目构建的输出,都称之为构件)都可以使用Maven坐标唯一标示。Maven坐标的元素包括:groupId、artfactId、version、packaging、classifier。例如下面就是Mysql驱动的坐标:
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.31version>
dependency>
参数说明:
groupId:定义当前Maven项目隶属的实际项目
artfactId:该元素定义实际项目中的一个Maven项目
version:该元素定义Maven项目当前所处的版本
packaging:该元素定义Maven项目的打包方式,(jar或war)默认是jar
classifier:该元素用来帮助定义构建输出的一些附属构件
一个依赖声明可以包含以下一些元素:
"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">
...
...
...
...
...
...
...
...
...
...
...
...
...
...
参数说明:
groupId、artfactId和version是Maven坐标的基本元素
type:依赖的类型
scope:依赖的范围。依赖范围就是用来控制依赖与(编译classpath、测试classpath、运行classpath的关系,包括compile、test、provided、runtime、system、import。 Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
optional:标记依赖是否可选。
exclusions:用来排除传递性依赖。
Maven可以在某个位置统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。
对于Maven来说,仓库可以分为两类:本地仓库和远程仓库,如图所示。当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库有此构件,则直接使用;如果没有,或者需要查看是否有更新的构件版本,Maven就会到远程仓库查找,找到构件下载到本地再使用。
中央仓库是Maven核心自带的的远程仓库。
私服是一种特殊的远程仓库,是在局域网内架设私有的仓库服务器。用其代理所有外部的远程仓库,供局域网内的Maven用户使用,从而降低中央仓库的负荷。
<repositories>
<repository>
<id>nexus-snapshotsid>
<name>Nexusname>
<url>http://localhost:8081/nexus/content/groups/public/url>
<releases>
<enabled>trueenabled>
<updatePolicy>dailyupdatePolicy>
<checksumPolicy>ignorechecksumPolicy>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
repositories>
参数说明:
releases的值为true,表示开启Nexus仓库的发布版本下载支持
snapshots的值为true,表示开启Nexus仓库的快照版本下载支持
updatePolicy配置从远程仓库检查更新的频率,有never/always/interval:x,默认是daily
checksumPolicy配置Maven检查检验和文件的策略,其值为:warn/fail/ignore,默认是warn。
大部分远程仓库无须认证就可以访问,但出于安全考虑,我们需要提供认证信息才能访问一些远程仓库。Maven使用settings.xml文件中的server元素配置仓库认证信息。
<servers>
<server>
<id>nexus-snapshotsid>
<username>swcusername>
<password>swc123password>
server>
<server>
<id>nexus-releasesid>
<username>swcusername>
<password>swc123password>
server>
<server>
<id>tomcat7id>
<username>swcusername>
<password>swcpassword>
server>
servers>
Maven除了能对项目进行编译、测试和打包之外,也可将项目生成的构建部署到仓库中。在pom文件中配置如下,在命令行运行mvn clean deploy
Maven就会将项目构建输出的构建部署到配置对应的远程仓库。
<distributionManagement>
<repository>
<id>nexus-releasesid>
<name>Nexus Release Repositoryname>
<url>http://localhost:8081/nexus/content/repositories/releases/url>
repository>
<snapshotRepository>
<id>nexus-snapshotsid>
<name>Nexus Snapshots Repositoryname>
<url>http://localhost:8081/nexus/content/repositories/snapshots/url>
snapshotRepository>
distributionManagement>
Maven的生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有的构建步骤,生命周期是抽象的,不做任何实际的工作,都交由插件来完成。
Maven拥有三套相互独立的生命周期:clean(清理项目)、default(构建项目)、site(建立项目站点)。在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行。
clean生命周期一共包含了三个阶段:
pre-clean 执行一些clean之前完成的工作
clean 清理上一次构建生成的文件
post-clean 执行一些clean之后完成的工作
Maven的最重要的default生命周期,绝大部分工作都发生在这个生命周期中。
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
#处理项目主资源文件,一般来说,是对src/main/resources目录内容复制到项目输出的classpath目录中。
compile
# 编译项目的源代码。一般来说,是编译src/main/java目录下的java文件至项目输出的classpath目录中。
process-classes
generate-test-sources
process-test-sources
#处理项目测试资源文件一般来说,是对src/test/resources目录内容复制到项目输出的classpath目录中。
generate-test-resources
process-test-resources
#复制并处理资源文件,至目标测试目录。
test-compile
#编译测试源代码。一般来说,是编译src/test/java目录下的java文件至项目输出的classpath目录中。
process-test-classes
test
#使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package
#接受编译好的代码,打包成可发布的格式,如 JAR 。
pre-integration-test
integration-test
post-integration-test
verify
install
#将包安装至Maven本地仓库,供本地其它项目依赖。
deploy
#将最终的包复制到远程仓库,以让其它开发人员与项目共享。
Site生命周期的各个阶段:
pre-site 执行一些需要在生成项目站点之前完成的工作
site 生成项目的站点文档
post-site 执行一些需要在生成项目站点之后完成的工作,并且为部署做准备
site-deploy 将生成的项目站点部署到特定的服务器上
在pom文件中配置插件仓库,
<pluginRepositories>
<pluginRepository>
<id>nexusid>
<name>Nexusname>
<url>http://localhost:8081/nexus/content/groups/public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
pluginRepository>
pluginRepositories>
添加插件配置
<build>
<finalName>${project.name}finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>utf-8encoding>
<compilerArgument>-Xlint:allcompilerArgument>
<showWarnings>falseshowWarnings>
<showDeprecation>falseshowDeprecation>
configuration>
plugin>
<plugin>
<groupId>org.eclipse.jettygroupId>
<artifactId>jetty-maven-pluginartifactId>
<version>9.2.1.v20140609version>
<configuration>
<httpConnector>
<port>8080port>
httpConnector>
<webAppConfig>
<contextPath>/${project.name}contextPath>
webAppConfig>
configuration>
plugin>
plugins>
build>
mvn dependency:list 了解项目中所有依赖的基本信息
mvn dependency:tree 生成依赖树,查看依赖信息。
maven clean:清理上一次构建生成的文件。
mvn test 运行测试
mvn compile 编译项目
mvn deploy:将项目构建输出的构件部署到配置对应的远程仓库。
mvn install 将项目的构建输出文件安装到本地仓库。
mvn package -Dmaven.test.skip=ture 打包时跳过测试