maven整理
一、安装(windows)
1、登陆官网:https://maven.apache.org/index.html下载
2、安装
3、设置环境变量
a)新建:M2_HOME = maven的安装目录
b)path += %M2_HOME%\bin
c)MAVEN_OPTS = -Xms128m -Xmx512m (非必设置)
4、检查安装情况:cmd窗口:mvn -v
出现类似信息,则表示安装正常:
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: E:\dengk\apache-maven-3.6.3\bin\..
Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: C:\Program Files\J
ava\jdk1.8.0_181\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
5、升级:下载新版文件解压,然后修改M2_HOME值指向新安装地址
6、目录结构:
a)bin : mvn 运行的脚本
b)boot : 仅1个jar:plexus-classworlds-xxx.jar 是一个类加载器
c)conf : 包括settings.xml,此文件定制全局maven。该文件不要修改,可复制到"C:\Users\Administrator\.m2"下
d)lib : maven运行时需要的类库,其中还可以找到内置超级POM
7. ~/.m2:
* mvn help:system --打印出所有的java系统属性和环境变量
a)此文件在登陆用户文件夹下,放置了maven本地仓库:.m2/repository
b)可将全局settings.xml复制到.m2/下
8、设置http代理:
在.m2/settings.xml中设置:见settings设置
9、安装m2eclipse
10、eclipse中选新安装的maven,不要选择其自带的
重点:
1.M2_HOME = maven的安装目录
2.path += %M2_HOME%\bin
3.MAVEN_OPTS = -Xms128m -Xmx512m
二、eclipse中的maven
1.右键单击pom--run as 中可以看到常见maven命令,如没有则选maven build自定义命令
三、依赖:
1.传递性
A依赖B,B依赖C:则A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖
依赖的范围影响传递性依赖,见下表
compile test privided runtime
compile compile - - runtime
test test - - test
privided privided - privided privided
runtime runtime - - runtime
2.依赖调解:
a)路径最近优先
b)第一声明优先
3.可选依赖(不建议使用):
A->B 且 A->C 称为可选依赖,只对当前项目发生影响,此依赖不会传递
上述情况可拆分成2个项目,各自设置依赖
4.排除依赖
A->C B->A B可显示声明排除对C依赖(如果B不想让它传递过来)
5.归类依赖:使用maven属性设置归类依赖,可用来设置一组相似依赖的版本(如spring-xxx)
设置属性:
<properties>
<propName>propValue</propName>
</properties>
引用:
<version>${propName}</version>
6.优化依赖:
利用mvn dependency:xxx 系列命令查看依赖,删除,增加依赖,实现优化
四、仓库
1.一般构件路径:groupId/artifactId/version/artifactId-version.packaging(文件名与坐标元素相关)
2.仓库分类:
本地仓库(1个):.m2/ --可定制地址;可将构件jar复制到本地仓库,根据坐标计算位置(见上)
远程仓库(多个):
中央仓库:maven核心自带远程仓库(默认选择)
私服:一般内部项目用
其他公用远程仓库:如java.net.Maven库、JBoos Maven库等
3.远程仓库认证:见settings.xml元素设置
4.部署到远程仓库:
a)配置pom文件
b)运行:mvn clean deploy
5.发布版本和快照版本:快照版本用于开发,发布时将快照版本改为发布版本
6.计算最新版本基于groupId/artifactId/maven-metedata.xml文件
release 最新发布版本
latest 最新版(包括快照)
建议不使用上述版本依赖---不稳定
7.镜像:由于网络原因,在别处建立的相同内容的仓库(mirrors).镜像仓库也可以认证
8.仓库搜索服务:Sonatype Nexus,Jarvana,MVNbrowser....
五、生命周期与插件
maven生命周期,每个生命周期可以对应多个插件,有的生命周期对应默认插件,3个生命周期相互独立。
mvn命令主要就是调用maven生命周期的各阶段
1.clean:清理项目
pre-clean :清理前做些事
clean:清理上次构建生成的文件
post-clean :清理后做些事
2.default:构建项目
validate:
initalize:
generate-sources:
process-sources: 处理主要资源文件,将main/resources目录下文件复制至classpath目录中
generate-resources:
process-resources:
compile:编译主源码
process-classes:
process-test-classes:
generate-test-resources:
process-test-resources:
test-compile:编译项目测试代码
generate-test-classes:
test:单元测试,不会打包部署
prepare-package
package
pre-integration-test
integration-test
post-integration-test
verify
install:将包安装本地仓库
deploy:上传远程仓库
3.site:建立站点
pre-site:
site:生成项目站点文档
post-site:
site-deploy:发布站点到服务器上
再说一次,命令就是在调用各生命周期
* 如:mvn clean install
调用了clean的2个阶段和default生命周的从validata至install的全部阶段
4.插件:生命周期只是抽像,具体任务由插件来完成。
插件目标(plugin goal):1个插件可以有n个目标,每个目标对应1个功能
maven-depandency-plugin有10多个目标,分别对应:
dependency:analyze
dependency:tree
dependency:list ....
冒号前是插件前缀,后面是目标
5.插件绑定:生命周期与插件(目标)互相绑定,用以完成任务构建
6.内置绑定:maven默认为部分生命周期阶段绑定了插件(有的生命周期对应有插件,有的没有)
a)default周期的绑定与打包类型相关(类型见pom.packageing)
b)可从命令行看到执行了哪些插件目标
7.自定义绑定:自定义将某插件绑定到生命周期的某阶段(见pom.plugins),应设置非快照版本
a)可通过hepl命令查看插件信息
b)多个插件绑定1个阶段,以声明先后顺序执行
c)配置:
I 命令行(非所有插件) -D参数
例:mvn install-Dmaven.test.skip=true --将maven.test.skip参数设置为true
II pom : 实现全局配置(见pom.plugins)
8.插件配置:
可将1个插件目标配置到多个阶段
9.使用mave-help-plugin描述插件:(见命令)
目标:describe 查看插件信息
10.目标前缀:简化命令 --如help 代表maven-help-plugin的目标前缀
11.插件解析:通过前缀能找到对应插件,但前缀未指定坐标,如何找?
插件查找:先在本地仓库找,再去专门配置的插件远程仓库找(非普通远程仓库),一般配中央仓库。
插件远程仓库pluginRepositories(settings.xml,pom.xm中均可设置:见settings设置)
如果为maven官方插件,可省略groupId(不建议)
版本可省略(因超级pom配置了常用插件版本,自定义的maven会自行判断)(不建议)
六、继承与聚合
maven将项目分成不同的模块,使用聚合与继承简化pom,促进模块配置的一致性。
1.聚合(快速构建):将不同模块聚合在一起,实现多模块的1次性批量构建
a)额外创建1个聚合模块,将多模块聚合在一起,此模块仅有pom.xml
b)聚合模块打包必须为pom
c)通过module元素将子模块聚合(pom.mudule)
d)一般将聚合模块放在项目目录最高层
2.继承(消除重复):抽取各模块依赖与插件,实现去重,一次声明,多处使用
a)创建父模块(类似聚合),一般在上一级目录 --当为../时 maven能自动识别
b)打包为pom
c)其他模块继承(pom.parent),包括groupId,version,依赖,插件等都可以继承
d)将父子模块均加入到聚合模块
e)技巧:父模块使用pom.dependcyManagement配置dependencies依赖,子模块重写需要的dependencies --插件用法相同:见pluginManagement配置
I dependcyManagement会被继承,但不会引入依赖
II 子模块中重新声明依赖,可实现某些子模块无须继续父模块的所有依赖
III 保证版本统一性,父模块将版本设置为变量,由dependcyManagement取出,子模块继承后无需再写版本号
原则:
a).1个项目子模块都就具有相同groupId,version;artifactId使用一致前缀
b).实际项目中,一个模块可能既是聚合又是父POM
*约定优于配置:遵守maven约定(超级pom已定义好)
3.反应堆:根据各模块及其之间关系,形成的构建顺序
a)不能出现循环
b)可以裁剪反应堆:仅构建部分模块(见mvn命令),加入参数实现不同构建(详P541)
-mvn -h --查看所有选项
其中:
-am --also-make --同时构建所列模块的依赖模块
-amd -also-make-dependents --同时构建依赖于所列模块的模块
-pl --projects <arg> --构建指定模块,用逗号分隔
-rf -resume-from <arg> --从指定模块回复反应堆
例:
mvn clean install -pl account-email,account-persist
mvn clean install -pl account-email -amd
localRepository:设置本地仓库地址如:D:\java\xxx
repositories : 仓库组,下可配置多个仓库
repository :仓库,可多个
<repository>
id: 仓库id唯一
name:
url:
releases: 发布版本
enabled:开/关
updatePolicy: 检查更新频率 -- daily 每天,never 从不,always 每次,interval:X 每X分钟
checksumPolicy: 检查检验和文件策略 ,默认warn --warn 检验失败则警告,fail 构建失败,ignore 忽略校验和错误
snapshots : 快照版本
enabled:开/关
updatePolicy:同上
checksumPolicy:同上
layout : 布局方式(一般填:default)
</repository>
插件远程仓库:
pluginRepositories:
pluginRepositorie:
--此处配置同repository
仓库认证:
<servers>
<server>
id:必须与repository元素中id完全一致,2者是对应的
username:
password:
</server>
</servers>
mirrors:
mirror:
id:
name:
url:
mirrorOf:源仓库的名称 --*表示对所有仓库镜像,其他高级参数见p346
proxies:代理
<proxies> <!--可配置多个代理-->
<proxy>
<id>my-proxy</id>
<active>true</active> <!--表示激活代理-->
<protocol>http</protocol> <!--代理协议-->
<host>218.14.227.197</host>
<port>3128</port>
<!--
<username>***</username>
<password>***</password>
<nonProxyHosts>repostitory.mycom.com|*.google.com</nonProxyHosts> 表示哪些主机名不需要代理,用|号分隔,可用通配符*
-->
</proxy>
</proxies>
-
maven 命令:
基本用法:mvn [options] [<goal(s)>] --goal表示在哪个阶段执行
mvn -v : maven环境信息
mvn clean : clean表示清理输出目录(target)
mvn compile : 编译项目主代码
mvn test : 执行测试
mvn clean package : 打包,将项目打包成jar,放在target目录中
mvn clean install : 安装,将输出的jar安装到本地仓库,此后可以由所有Maven项目使用
mvn archetype:generate : 利用archetype生成项目骨架
mvn dependency:list : 显示当前项目的所有依赖关系(列表)
mvn dependency:tree : 显示当前项目的所有依赖关系(树)
mvn dependency:analyze : 列出使用但未声明的依赖和声明但未使用的依赖
mvn clean deploy : 将项目输出的构件配置到远程仓库
mvn help:describe-Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1-Detail --可省去版本信息,自动找最新 -
pom文件配置 maven 元素:
modelVersion:maven当前模型(与maven版本相关)
- maven坐标(5元素)
groupId:(项目/模块/构件)组 --类似1个传统项目 必须
artifactId:组中唯一的ID(项目/模块/构件ID) --类似1个传统项目的模块,必须
version:版本号 --1.0-SNAPSHOT 意为快照,必须
packageing : 打包方式,与包扩展名对应 --jar , war , pom, maven-plugin, ear 等,默认jar,非必设置
classifier : 包中的附属构件(对应主构件) --包括 jar,javadoc等,不能直接定义,需附属于主构件,由附加插件生成 非必须
name:项目名称
dependencies:依赖组,下面可包括多个dependency(依赖)元素
<dependencies>
dependency : 依赖元素
<dependency>
groupId,artifactId,version : 根据坐标才能找到依赖
type : 依赖类型,坐标对应的packaging --默认jar,非必设置
scope : 依赖的范围 (编译classpath,测试classpath,运行classpath)
--compile 编译,test 测试
--provided 编译、测试
--runtime 测试、运行
--system 范围与provided完全一致,但必须通过systemPath显示指定,
system 例:
<scope>system</scope>
<systemPath>$ {java.home}/lib/rt.jar</systemPath>
--import 导入依赖范围(8.3.3)
optional : 标记依赖是否可选 (5.9.1)
exclusions : 排除传递性依赖 --排除传递性依赖中的某些依赖.只需声明排除的groupId,artifactId即可
</dependency>
</dependencies>
发布版本到远程仓库设置:
<distributionManagement>
<!--多个,发布版本-->
<repository>
id:
name:
url:
</repository>
<!--多个,快照版本-->
<snapshotRepository>
id:
name:
url:
</snapshotRepository>
</distributionManagement>
自定义绑定:自定义将某插件绑定到生命周期的某阶段
build:
plugins:
plugin:
groupId:
artifactId:
version:
exclusions:
exclusion: --执行配置
id:
phase: --生命周期阶段;有时无此项也可绑定,是因为有的插件默认绑定了阶段,可通过命令查看插件详情
goals:
<goal>xxx</goal> --xxx:插件目标,如jar-no-fork
聚合:
modules:
module: --填写子模块的相对目录地址
继承:
parent:
3坐标:
relativePath: --父模块相对路径(默认../pom.xml)
依赖配置: --不会真导入依赖,只是一种配置,其中值可被真实依赖调用
dependcyManagement:
dependcys: ...
插件配置: --不会真导入插件,只是一种配置,其中值可被真实插件调用
pluginManagement:
plugins: ....
七、Idea使用
1.设置更新
- https://blog.csdn.net/weixin_44504146/article/details/99444067