Maven学习笔记
一:Maven
好处:管理项目,为项目提供统一的开发、测试、打包和部署,能让开发者在多个项目中方便的切换。
二:Maven工作原理
maven采用远程仓库、本地仓库和pom.xml。
过程:在运行maven命令的时候,会去加载pom.xml文件,就可以知道该项目中都需要引用哪些jar了。
请求顺序:请求本地 —> 请求私服 -->请求其他 远程仓库 --> 请求中央仓库,如果没有找到需要的构件,则会报错。
正常情况下jar包存在于三个地方, Local仓库,Nexus私服仓库,镜像或者maven中央仓库。
step1: 当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;
访问私服,找不到的话,私服会去访问远程别的仓库,找到了会将jar包缓存的到自己这里;
step2: 如果本地仓库不存在此构件,maven会访问私服,下载到本地再使用;
step3:私服上没有的话,私服是由能力去访问其他远程仓库的,它会遍历其他的远程仓库,找到需要的构件之后,会缓存到私服上,以便下次使用;
step3: 如果本地仓库和远程仓库都没有需要的构件,会去中央仓库仓库查找。中央仓库是maven核心自带的远程仓库,它包含了绝大部分开源的构件;
step4: 如果都没有找到,maven就会报错。
图:
三:仓库
maven仓库分为两类:本地仓库和远程仓库。远程仓库中又分成了3种:私服,其他公共库,中央仓库
本地仓库:也就是 .m2/repository目录
私服:是特殊的远程仓库,在局域网内使用
主流的的私服: Apache的Archiva、JFrog的Artifactory、Sonatype的Nexus
其他公有仓库:
远程仓库:
是通过<repositories>、<repository>变签实现的:在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
<repositories> <repository> </repository> <repository> </repository> </repositories>
私服:
好处:
1.减少宽带和时间;
2.降低中央仓库的压力,中央仓库是公有的,大家都可以访问,所以访问速度会有限制;
3.有些jar包由于版权原因,maven中央仓库没有,比如oracle JDBC驱动。另外也会有一些项目中用到的比较老的开源jar包, 中央仓库也没用。这种情况我们需要把jar包手动上传到私服;
4.公司自己开发的jar包并不开源,不能上传到maven中央仓库,只能部署到私服上面。
补充:私服就是我们配置的镜像服务器,镜像就是私服,只是不同地方命名不同,都是仓库,不用纠结名称。
<mirrors> <mirror> <id>nexus</id> <name>internal nexus repository</name> <url>http://183.238.2.182:8081/nexus/content/groups/public/</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors>
镜像mirrors:
<mirrors> <mirror> <id>intranet repository</id> <name>intranet repository</name> <url>http://171.1.1.111:9000/nexus/content/groups/public</url> <mirrorOf>*</mirrorOf> </mirror> <mirror> <id>public repository</id> <name>public repository</name> <url>http://171.2.2.38:9000/nexus/content/groups/public</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors>
中央仓库:是maven自带的远程的仓库,包含了绝大部分开源的构建。
中央仓库不需要手动配置,默认的是: http://repo1.maven.org/maven2/ 当然了也可以覆盖中央仓库,在mirrors中修改,将mirrorOf的属性值设置为central即可。
1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ (推荐仓库) 3. http://repo1.maven.org/maven2
四:如何处理下载失败
pom.xml经常就报找不到某某某jar包的错,很烦很头疼。正常情况下jar包存在于三个地方, Local仓库,Nexus私服仓库,镜像或者maven中央仓库。以所列出的顺序为准,搜索的过程由前往后,下载的过程由后往前。下载过程分两段,镜像或者maven中央仓库=>Nexus私服仓库,Nexus私服仓库=>Local仓库,两段都可能出问题。出问题也没事,重试,但maven会在Local仓库中生成一份以lastUpdated结尾的文件,一个错误的缓存(cache)。需要手动删除缓存。
先判断是哪一段出错,选择Repositories=>Central=>Brower Storage,看一下对应的jar包在Nexus私服上面有没有,没有的话说明镜像或者maven中央仓库=>Nexus私服仓库下载失败,否则Nexus私服仓库=>Local仓库下载失败。
镜像或者maven中央仓库=>Nexus私服仓库下载失败处理方法
删除Local仓库的缓存。打开~/.m2/repository文件夹,删除报错jar包所在的文件夹(也可以只删除特定的子文件,提高效率)。删除Nexus私服仓库的缓存。Repositories=>Central=>Brower Storage,选择对应的目录树,右键先Expire Cache,后Delete。
Nexus私服仓库=>Local仓库下载失败处理方法
这种情况简单很多,只要删除Local仓库的缓存即可。步骤如上。
五:maven jdk 配置
新建的项目,报错提示说,maven与jdk的版本不匹配。于是在Build Path中进行修改,之后update project之后,又会回到之前的jdk版本,所以需要在配置文件中进行配置,这样每次更新项目,jdk版本就不会改变了。
setting.xml文件:
<profile> <id>jdk1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>
参考:https://www.cnblogs.com/bianqi/p/6819074.html