Maven核心功能是合理叙述项目间的依赖关系,大白话就是通过POM文件的配置来获取jar包,POM(project object model),即项目对象模型,POM通过groupId,artifactId,version来定位一个jar包,首先groupId一般为包名,artifactId为项目名,version为项目版本。除了这几个基本属性,还有很多高级的辅助属性,有机会详细学习。
一、Maven中仓库的概念
1.本地仓库
我们在maven的setting.xml里配置本地仓库的路径,默认为C:\.m2\repository
我们通过POM引入的jar包都会被下载到本地仓库
2.第三方仓库(私服)
公司内部搭建的私有maven仓库,存放公司内部的一些jar包,项目开发中,一般都会用到私服。
3.中央仓库
Maven的远程公用仓库,地址为: http://repo1.maven.org/maven2/,这个仓库是Maven自己维护的,里面有大量的我们需要的包。
二、Maven查找JAR包流程图
三、Maven java项目目录
src/main/java 存放java源码
src/main/resources 存放java配置文件
src/test/java 存放java测试源码
src/test/resources 存放java测试配置文件
pom 配置项目引用,置于根目录
target 存放项目编译后的文件,即输出目录
四、Maven web项目目录
src/main/java存放java源码
src/main/resources 存放java配置文件
src/main/webapp
- - WEB-INF 存放页面文件
- - web.xml web项目的一些配置
src/test 存放java测试相应文件
pom 配置项目引用,置于根目录
target 存放项目编译后的文件,即输出目录
五、Maven生命周期
借鉴博客:http://www.cnblogs.com/luotaoyeah/p/3819001.html
maven定义了三套生命周期(clean,default,site),每个生命周期都包含一些阶段(phase),三套生命周期相互独立,单例每套生命周期里的phase有先后顺序,执行后面的phase时,前面的会自动依顺序执行。
六、Maven常用命令
mvn clean 删除target目录以及包含的文件
mvn compile 编译src/main/java目录,并生成.class文件,存到target目录下
mvn test 编译src/test/java目录
mvn package 生成压缩文件(项目jar/war包),存到target目录下
mvn install 将压缩文件上传到本地仓库
mvn deploy 将压缩文件上传到私服
七、Maven dependency属性配置
1.Optinal可选依赖(默认false)
标记依赖是否可选
举例:A→B→C
这时默认A会依赖C,如果在B项目中将C的optional设置为true,则A在引用B的时候不依赖C
2.Exclusion 依赖排除
排除依赖传递
举例:
A→C(版本为1.8)
B→C(版本为2.3)
如果我项目中同时引入A,B,这时C的版本就会冲突,如果我们想引入C(2.3)的话,就在A的dependency下设置exclusion C,这时引入A的时候就不会依赖C(1.8)了
3.scope
指定依赖范围,默认compile
compile 适用于所有阶段(编译,测试,运行),随项目打包发布
provided 在编译,测试阶段使用,war包的时候不会随项目打包发布
runtime 在测试,运行阶段使用,随项目打包发布
test 只在测试时使用,不会随项目打包发布
system 系统范围 其依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。
4.type
八、Maven依赖调节原则
第一原则:路径近者优先原则
举例:
A→B→C(C中引用了X包1.5版本)
E→C(C中引用了X包1.2版本)
此时引用的X包版本为1.2
第二原则:第一声明者优先原则
举例:
A→B(B中引用了X包1.7版本)
C→D(D中引用了X包1.1版本)
若A在C前面引入,则此时引用的X包版本为1.7
若C在A前面引入,则此时引用的X包版本为1.1
Maven会先根据第一原则进行选择,第一原则不符合会根据第二原则选择
九、搭建Maven私服
参考博客:https://blog.csdn.net/plei_yue/article/details/78299451
Jdk 1.8
Tomcat 8.5.23
Nexus(Nexus是一种远程仓库) 2.14.5-02
- 下载nexus的war包,放入tomcat的webapp下
- 手动启动tomcat(执行startup.bat),浏览器访问http://localhost:8080/nexus-14.5-02
3.通过右上角LOG IN登录,默认用户名admin,密码admin123,进入Repositories
Neuxs仓库类型
1.Group(仓库组):一组仓库的集合
2.Hosted(宿主):配置第三方仓库(包括公司内部私服)
3.Proxy(代理):私服会对中央仓库进行代理,用户连接私服,私服回到中央仓库下载jar或插件
4.virtual(虚拟):兼容Maven1版本的jar或插件
Nexus的仓库和仓库组介绍:
3rd party: 一个策略为Release的宿主类型仓库,用来部署无法从公共仓库获得的第三方发布版本构建
Apache Snapshots: 一个策略为Snapshot的代理仓库,用来代理Apache Maven仓库的快照版本构建
Central: 代理Maven中央仓库
Central M1 shadow: 代理Maven1 版本 中央仓库
Codehaus Snapshots: 一个策略为Snapshot的代理仓库,用来代理Codehaus Maven仓库的快照版本构件
Releases: 一个策略为Release的宿主类型仓库,用来部署组织内部的发布版本构件
Snapshots: 一个策略为Snapshot的宿主类型仓库,用来部署组织内部的快照版本构件
Public Repositories:该仓库组将上述所有策略为Release的仓库聚合并通过一致的地址提供服务
4.测试上传到本地私服(好像是传到私服中会以.byte文件存储)
在IDEA中对项目执行deploy,执行后去私服里查看是否成功上传(我的已经测试成功)
5.测试从本地私服拉包
现在在本地就可以拉取我们配置的私服中刚刚我们手动deploy上去的包了(前提是遵循下面的配置)
settings.xml中
<localRepository/>本地仓库地址
<servers/>配置服务ID,私服的用户名密码
<mirrors/>配置镜像
详情:https://www.cnblogs.com/keyi/p/7475901.html