前言:此为个人阅读《Maven实战》的笔记,非入门教程。
一、安装配置:
1、安装并配置好JDK;
2、从Apache下载适当版本的maven压缩包;
3、解压maven压缩包,放在适当位置,需要配置环境变量:
M2_HOME:maven所在目录;
PATH:%M2_HOME/bin;
还可以配置 MAVEN_OPTS,值为:-Xms128m -Xmx512m,调整mvn运行时内存。
二、安装目录分析:
1、bin:包含了mvn运行的脚本,其中mvn和mvnDebug的区别是:mvnDebug多了一条MAVEN_DEBUG_OPTS配置,用来开启debug,调试Maven本身;
2、boot:plexus-classworlds-x.x.x.jar,是一个类加载器框架,拥有更丰富的语法以方便配置;
3、conf:包含settings.xml,默认全局可用(可将此文件复制到 ~/.m2/目录下,使其变为用户范围可用);
4、lib:包含maven运行的所有java类库。
三、pom.xml文件:
pom.xml文件位于项目的根目录中,用来描述项目如何构建,声明项目依赖等:
4.0.0
com.me
search
0.0.1-SNAPSHOT
jar
search
http://maven.apache.org
UTF-8
modelVersion:指定了当前POM模型的版本,对于maven2和maven3,固定为4.0.0;
groupId、artifactId、version为坐标;
name:声明一个对于用户更为友好的项目名称;
三一、小记录:
1、项目的主代码会被打包到最终的构件中(如jar),而测试代码只在运行测试时用到,不会被打包;
2、如果不声明scope,则默认为compile,表示对主代码、测试代码都有效;
3、Maven的核心插件----compiler只支持编译java1.3,需要配置java编译版本:
org.apache.maven.plugins
maven-compiler-plugin
1.8
UTF-8
4、默认的打包类型为jar;
5、可以使用 finalName 来自定义打包生成的文件名称;
6、默认打包的 jar 文件无法运行,需要借助 maven-shade-plugin 插件:
或者手动编辑 jar 文件中的 META-INF/MANIFEST.MF文件;
7、可以使用 Archetype 生成项目骨架:
(Maven3):mvn archetype:generate
四、坐标和依赖
1、Maven坐标的元素包括groupId、artifactId、version、packaging、classifier:
groupId:定义当前maven项目隶属的实际项目(必须);
artifactId:定义实际项目中的一个maven模块(必须);
version:定义maven项目当前版本(必须);
package:定义maven项目的打包方式,默认为jar;
classifier:定义构建输出的一些附属构件;
2、dependency属性:
3、scope依赖范围:
4、何为传递性依赖?
如果A->B(A依赖于B),B->C,那么A->C,其中,A->B称为第一直接依赖,B->C称为第二直接依赖;
5、依赖的优先级:
依赖调解第一原则:路径最近者优先;
依赖调解第二原则:第一声明着优先(在pom.xml先声明者优先级高);
6、optional可选依赖:
...
true
...
如果A->B,B->C(可选),则A不依赖C;如果A想要依赖C,需要在A的pom.xml中声明;
7、exclusion排除依赖:
...
...
...
如果A->B,B->C,若想让A不依赖于C,可使用排除;
8、常量设置:
...
<常量1>xxxx常量1>
...
使用时,使用 ${常量1} 引用;
9、优化依赖:
查看依赖树:
mvn dependency:list
分析依赖:
mvn dependency:analyze
结果中:
Used undeclared dependencies:指项目中使用(代码中被import)到,但是没有显式声明的依赖;
此一般出现在所使用的jar位于第二以上直接依赖范围,可能会发生改变,存在潜在风险;
Unused declared dependencies:显式声明但未使用(代码中未import)的依赖;
亦不可直接删除,如A->B,B->C,A未显式importC,但是B依赖C,如果剔除C,A使用的B中的功能无法运行;
五、仓库:
1、仓库的布局:
任何构件都有一个唯一的坐标,根据这个坐标可以在仓库中确定一个唯一的存储路径,这就是仓库的布局,一般格式为:groupId / artifactId / version / artifactId-version.packaging;
2、仓库的分类:
3、修改本地仓库存储位置:
在settings.xml中,修改:
仓库存储的绝对路径
4、配置远程仓库:
4.1、默认中央仓库地址配置在 $M2_HOME/lib/maven-model-builder-xx.jar/org/apache/maven/model/pom-4.0.0.xml中,id为central;
4.2、追加远程仓库:
注意事项:
a、id必须唯一;
b、如果id为 central,则会覆盖中央仓库的配置;
4.3、发行版、快照版更新配置:
true
daily
ignore
updatePolicy:配置maven从远程仓库检查的更新频率,默认 daily,可选值:never(从不检查)、always(每次构建检查)、interval(每隔X分钟检查一次);
checksumPolicy:配置maven检查校验文件的策略,默认 warn,可选值:fail(遇到校验错误直接构建失败)、ignore(忽略校验和错误);
4.4、远程仓库认证:
在settings.xml配置如下:
注意:此处的 id 必须和 repository 中的 id 一致;
4.5、部署到远程仓库:
如需配置认证,使用 4.4 中提供的认证方式;
配置后,直接使用 mvn clean deploy 发布;
5、镜像:
5.1、何为镜像?
如果仓库X可以提供仓库Y存储的所有内容,则认为X是Y的一个镜像;
5.2、配置:
注意:
mirrorOf值为 central,代表代理了中央仓库,如果想要代理所有仓库,将mirrorOf设置为 * ;
其他的mirrorOf配置项如下:
此处需要注意的是:远程仓库和镜像的区别。
6、快照版本:
6.1、快照的好处与作用
快照版本的表示方式为:xxx-SNAPSHOT,适合应用在开发环境,好处是:
当一个构建为快照版本时,maven会根据配置的 updatePolicy 策略检查快照版本是否有更新;在团队协作方面,只要构件提供方及时将构件的快照版本更新(deploy)到私服,构件使用方就可以使用;
除了 updatePolicy 策略外,还可以在运行命令时,添加 -U 参数,强制检查新版本;
6.2、快照的检查、解析机制:
如果使用的依赖版本为 SNAPSHOT,则基于更新策略读取远程仓库的 groupId / artifactId / version / maven-metadata.xml 文件,和本地进行合并比较,得到快照版本的最新值,然后检查本地仓库或者从远程仓库下载使用;
6.3、其他 RELEASE 和 LATEST
此配置位于 groupId / artifactId / maven-metadata.xml 下,作用和快照差不多;
六、生命周期和插件
1、生命周期:
Maven将工程构建过程进行抽象和统一,实际行为由插件进行完成,类似于设计模式中的模板方法;
2、插件目标:
Maven的核心仅仅定义了抽象的生命周期,具体的任务交由插件进行完成;
为了能够复用代码,在插件中定义了多个目标,一个目标就是一个功能;
3、插件绑定:
将生命周期的某个阶段与插件的目标进行绑定,以完成某个具体的构建任务;
比如,将 default 生命周期的 compile 这一阶段,和 maven-compiler-plugin 插件的 compile 目标绑定,完成编译任务;
4、
未完待续。。。