一.基础概念
1.Maven作为Apache组织中颇为成功的开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。从清理,编译,测试到生成报告,到打包部署,自动化构建过程。
还可以跨平台,对外提供了一致接口。
Maven可以适应极限编程XP.
2.Maven为全世界提供了一个免费的*仓库,几乎可以找到任何就行的来源类库,可以通过一些Maven衍生工具如Nexus,对其快速的搜索,只要定位了坐标,就能够自动下载。*仓库地址http://repol.maven.org/maven2/
3.其他的构建工具有Make,Ant等。
4.环境变量配置
M2_HOME :变量值为maven的安装目录
在path后添加%M2_HOME%\bin;
检查JDK,maven配置的cmd命令
echo %JAVA_HOME%
java_version
echo %M2_HOME%
mvn -v
mvn help:system 该命令会打印出所有的Java系统属性和环境变量
5.设置代理
有的公司基于安全考虑会要求使用通过安全认证的代理访问因特网。
ping repol.maven.org 可以检查网络
检查代理 ip 218.14.227.197 端口为3128的服务器是否畅通:telnet 218.14.227.197 3128,如果正确,输入ctrl+]然后q,回车,退出即可。
然后设置/.m2/setting.xml.
eclipse 等在集成maven时会安装上一个内嵌的Maven,因为内嵌的版本通常比较新,但不一定稳定,而且也往往会在和在命令行使用的maven不是同一个版本,
Windows -preferences -maven-installation
Embedded maven为内嵌的。
然后单击add添加maven的安装目录M2_HOME
6.maven项目的核心是pom.xml,POM(Project Object Model项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等。
1)第一行定义了文档的版本和编码方式
2)紧接着是project是所有pom.xml的根元素,声明了一些POM相关的命名空间以及xsd元素,虽然这些属性不是必须的,但是可以让第三方工具如IDE的XML编辑器帮助我的快速的编辑PO但是可以让第三方工具如IDE的CNLXML编辑器帮助我的快速的编辑POM.
IDE(Integrated Development,集成开发环境)
3).modelVrision指定当前pom版本,对于maven2 3来说,版本只能是4.0.0
4).groupId artifactId,version这三个元素定义了一个项目的基本坐标,在maven世界里,任何jar pom war 都是基于这些项目坐标进行区分的。
groupId 组,这个组往往和项目所在的组织或者公司存在关联,
artifactId定义了当前maven项目在组中的唯一ID
version定义当前项目版本 1.0-SNAPSHOT说明项目还在还处于开发中,不是稳定的版本。随着项目的发展,version会不断的更新,如升级为1.0,1.1-SNAPSHOT,1.1,1.2-SNAPSHOT等。
5).name声明了一个对于用户更为友好的项目名称,虽然不是必须的,但是还是推荐为每个POM命名,以方便信息交流。
6)packaging定义maven项目的打包方式,不定义时默认为jar,
7)classifier 用来帮助定义构建一些附属构建,附属构件与主构件对应。如hello-1.0.jar,可以生成一些包含java文档的hello-1.0-javadoc.jar,和包含源代码的sources构件hello-1.0-sources.jar.
groupId artifactId version是必须的,packaging是可选的,classifier是不能直接定义的。
7)dependencies 声明项目的依赖
7.主代码包含项目主代码和测试代码,前者前者会打包到最终的构件如jar中,而测试代码只在运行测试时用到,不会被打包。遵循maven约定,主代码在src/java/main目录下,测试代码在src/test/main
一般来说,项目的包命名要基于项目的groupId和artifactId ,这样更加清晰,更加符合逻辑,也方便搜索构建和java类。
在项目目录下运行 clean compile
默认情况下,maven构建的所有输出都在 target/目录中,clean为清理输出目录 target/
compile 编译将项目代码编译至target/classes目录,编译为·Class文件。
8.scope为依赖范围,如果不声明就是默认compile,表示该依赖对主代码和测试代码都有效。
详见http://www.cnblogs.com/kavlez/p/4381103.html
9.一个典型的单元测试包含三个步骤,
1)准备测试类及数据
2)执行要测试的行为
3)检查结果
所有的测试方法用@T所有的测试方法用@Test标注,
所有的方法名以test开头(Junit3的约定)。
maven clean test ,在maven执行测试之前会先自动执行项目主资源的处理,主代码编译,测试资源处理,测试代码编译。
由于历史原因,maven的核心插件之一compiler默认只支持编译Java1.3,因此需要配置该插件对java其他版本的支持,
<project>
…
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
…
</project>
10.指令
clean:删除target/输出目录
clean compile:先clean,后编译主代码。
clean test:先clean,然后处理主代码,编译主代码,处理测试代码,编译测试代码,然后执行测试。
clean package:先clean,然后编译,测试,最后打包。
clean installation 先clean,然后package,然后install ,打包之后还不能为其他项目所用,需要install。
install就是把项目下载到本地仓库。
为了生成可执行的jar需要借助maven-shade-plugin
archetype 项目骨架。使用eclipse一般用quickstart骨架。
11.dependencies 依赖的配置,
1)groupId artifactId,version这三个元素定义了一个项目的基本坐标,
2)type类似与项目的packaging ,依赖的类型,可以不声明,默认为jar
3)scope依赖的范围
Maven编译代码时需要使用classpath,但classpath不止一种,而是:
编译classpath
测试classpath
运行classpath
Maven会根据需要使用不同的classpath,而scope可以用来控制依赖与这三种classpath之间的关系。
compile:编译依赖范围,默认使用该项,对三种classpath都有效。
test:测试依赖范围,仅对测试classpath有效,如上面的Junit。
provided:已提供依赖范围,对编译和测试classpath有效,比如开头贴出的servlet-api的依赖,会在运行时由app server提供,Maven不可以重复引入。
runtime:运行时依赖范围,对测试和运行classpath有效,编译时无效。如jdbc驱动实现
system:系统依赖范围,和provided完全一致,对编译和测试classpath有效,但必须通过systemPath显示指定依赖文件的位置,可以使用系统环境变量。由于此类依赖不是通过maven仓库解析的,而往往与本机系统绑定,可能造成构建的不可移植,因此慎重使用。
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</scope>
import:不针对任何一种classpath,该项用于导入其他pom中的dependencyManagement元素。
依赖与classPath的关系
依赖的传递性
最左边表示第一依赖范围,横行表示第二依赖范围,交叉表示传递后的,
依赖的调解
原则1.路径最近者优先如
a -b-c-x(1.0) a-e-x(2.0)
前者路径长为三,后者为二,所以a实际的x为2.0版本,
在maven2.0.8版本以前,当两个路径一样时不确定是用哪个,在2.0.9版本后添加了第二原则
原则2,第一声明优先,在依赖路径长度相等时,在POM中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。
4)optional 可选依赖,
<optional>true</ooptional>
表示该依赖为可选依赖,只会对当前项目产生影响,其他项目依赖此项目时,需要显示声明此依赖,也就是可选依赖不会被传递。
在理想情况下是不应该使用可选依赖的,使用他的原因是某一项目实现了多个特性。
5).exclusion排除依赖,不想使用某个依赖,自己显示声明。
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
可以定义多个,不要定义version.
6). properties归类依赖
<properies>
<a.version>1.2.0</a.version>
</properties>
在下边定义版本version标签时可以如下表示
<version>${a.version}</version>
7).优化依赖
mvn dependency:list
查看依赖列表
mvn dependency:tree
mvn dependency:analyze 分析依赖
12.仓库
1).在不使用maven管理项目时,lib/目录下内容存在大量重复,仓库的布局
如log4j:log4j:1.2.15 对应仓库的路径为 log4j/log4j/1.2.15/log4j-1.2.15.jar
groupId/artifactId/version/artifactId-version.packaging
假如groupId中间有点如org.t假如groupId中间有点如org.test 就会分割成org/test
如果有classifier很在version后边
artifactId-version-classifier.packaging
2)本地仓库和远程仓库
本地仓库有直接使用,没有就去远程仓库下载,远程仓库也没有就会报错。
*仓库是maven核心自带的远程仓库,默认配置下本地没有就去*仓库下载。
私服是一种特殊的远程仓库,为了节省宽带和时间,在局域网内架设的一个私有的仓库服务器,用其代理所有的外部的远程仓库。
除了*仓库和私服,还有其他的公开的远程仓库如java.net maven 仓库 http://download.java.net/maven/2/
JBoss Maven库
http://repository.jboss.com/maven2/
等
3)修改本地仓库路径
默认c:\users\xxx\.m2\repository\
有时候会因为某些原因如c盘空间不够更改路
更改~/.m2/setting.xml设置localRepository元素值
如
<setting>
<localRespository>D:\java\repository\</localRepository>
</setting>
4)安装好Maven后,如果不执行任何命令,本地仓库是不存在的,只有在执行第一条指令后,maven才会开始创建本地仓库。
$m2_home/lib/maven-model-builder.3.0.jar
访问org/apache/model/pom-4.0.0.xml
所有maven都会继承的超POM
5).当创建了私服后,局域网内的maven用户使用时,找本地,本地没有去私服下载,私服没有再去外部仓库下载,缓存到私服上之后再下载到本地,此外一些无法从外部仓库下载的构件也能从本地上传到私服供大家使用。
即使一台直接连入internet的个人机器上使用maven,也应该在本地建立私服,可以
1.节省自己的外网宽带,
2.加速maven构建,
3.可以部署第三方构件,
4.提高稳定性增强控制(即使暂时没有网络连接,maven也可正常工作)
5.降低*仓库负荷
6)远程仓库的配置
repositories下可以定义一个或多个远程仓库,releases和snapshots元素比较重要,用来控制maven发布版构件和快照版构件的下载,这两元素还有两个子元素updatePolicy和checksumPolicy
updatePolicy用来配置maven从远程仓库更新检查频率。
daily 每天一次
never从不
always每次构建都更新
interval:X每隔几分钟,X为任意整数
checksumPolicy:配置检查校验和文件策略,当构件被部署到maven仓库中时,会同时生成对应的检验和文件。在构件被下载时,maven会验证校验和文件,如果失败,warn fail ignore.
7)远程仓库的认证
大部分无需认证就可以访问,
有时候出于安全考虑,组织内每个项目都有独立的的仓库,每个仓库有用户名密码,在本地setting.xml中配置
8)部署至远程仓库
repository发布版本构件的仓库
snapshotRepository:快照版本的仓库
mvn clean deploy输出到对应的远程仓库。
9) 当依赖的版本为release和lastest:会更新最新发布版本和最新版本(包含快照),基于groupId/artifactId/maven-metadata.xml,
,该文件列出了仓库中该构件的所有可用版本。lastest指向这些版本中最新的版本,release指向最新的发布版本。
当依赖的版本为快照时,maven会更新最新的快照,maven会检查仓库元数据groupId/artifactId/version/maven-metadata.xml,
该文件的snapshot元素包含了timetamp和builderNumber两个子元素,分表代表该快照的时间戳和构建号。
元数据并不永远正确,有时候当用户发现无法解析某些构件,或者解析得到错误的构件时,可能是元数据错误,需要手工或者使用工具如nexus对其进行修复。
10)镜像
如果仓库a可以提供仓库b存储的所有内容,那么就可以认为a是b的一个镜像。http://maven.net.cn/content/groups/public/是*仓库http://repol.maven.org.maven2/在中国的镜像,由于地理位置的因素,该镜像往往能提供比*仓库更快的服务。可以在setting.xml中配置maven使用镜像来代替*仓库。
配置私服作为镜像
需要注意的是由于镜像仓库完全屏蔽了被镜像的仓库,所以当镜像仓库不稳定或者停止服务时,maven将无法访问被镜像的仓库,因而将无法下载构建。
11).仓库搜索服务
1.sonatype nexus
http://repository.sonatype.org/
当前最流行的来源maven仓库管理软件。
2.jarvana
http://www.jarvana.com/jarvana/
支持浏览构件内容,提供了便捷的java文档浏览功能。
3.MVNbrowser
http://www.mvnbrower.com
只提供关键字搜索,除了提供基于坐标的依赖声明代码片断等功能之外,最大特色就是可以告诉用户该构件的依赖于其他哪些构件以及该构件被哪些构件依赖
4.MVNrepository
http://mvnrepository.com
界面比较清晰,提供了基于关键字的搜索,依赖声明代码片断,构件下载,依赖与被依赖关系信息,构建所包含的信息等功能,还提供了一个简单的图表,显示某个构件各个版本间大小的变化。