1. 梦回maven
本来不打算介绍maven的settings文件了,一来实在觉得没什么可介绍的,官方写的很详细也很清楚,但最近一两天又在这栽了,事实上我不止一次在maven的仓库上花了很长时间,很显然应该没完全搞懂,所以借着这次机会,再走一遍,给自己上进找一个理由。
这次遇到的问题和之前遇到的一样,死活都下载不到pom或者jar文件,造成这种问题的原因有可能是IDE有缓存,也可能是配置问题。
先看看我的配置文件吧。在profile里配置了各种仓库,我还配置了其他的,比如像阿里云的,但最终都报错找不到依赖。
js
<profile>
<id>repository-apache-org</id>
<repositories>
<repository>
<id>repository-apache-org</id>
<name>Apache Repository</name>
<url>https://repository.apache.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repository-apache-org</id>
<name>Apache Repository</name>
<url>https://repository.apache.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
多说一句,我真的用activeProfiles激活了,但就是依赖不到,这里边有一个点值得注意,如果下载的过程可能由于网络原因中断了,你的repository里可能存在lastUpdated后缀文件,删除重新下载。
后来我直接换成了mirror的方式
pom
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
mavne如果在mirror中找不到,就会去默认中心仓去找。
我去阿里云的仓库一看果然不存在spring-boot-starter
阿里云分了仓库,然后我又加了一行配置
js
<mirror>
<id>spring</id>
<name>aliyun spring</name>
<url>https://maven.aliyun.com/repository/spring</url>
<mirrorOf>spring</mirrorOf>
</mirror>
这次找到了,但报错的地方是找不到spring-cloud了,但阿里云上是有的呀?到底是啥原因,目前还不得而知。
再后来我又添加了其他的仓库,这次不报错了
js
<mirror>
<id>huaweicloud</id>
<mirrorOf>central</mirrorOf>
<name>huaweicloud maven</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
最终看到了胜利的果实
1.1 setttins.xml文件详解
其实我也是拿官方文档给翻译一遍,并没有什么高大上的,但很多博主明明是翻译官方的,整的好像是他自己摸索出来的,一点都没有互联网精神,啥叫互联网精神? 开放共存。
官方介绍了settings.xml文件存在的两个地方
- The Maven install:
${maven.home}/conf/settings.xml
${maven.home}指的是maven安装的目录,这是我本机安装的目录
- A user's install:
${user.home}/.m2/settings.xml
官方还说了,前者是全局的,后者是用户的,如果这两个都配置的话,内容会合并到一起。
咱们看一下settings包含哪些元素
xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
localRepository:repository要放到本地的位置
interactiveMode:用户和maven交互的模式,默认是是true的,比如通过命令行执行某些mvn命令
offline:离线构建,如果不能连远程仓库,可以开启,默认是false的,但一般我们都可以上网的,但有些场景下可能有安全因素,不让上网,可以开启该功能,现在是互联网时代,有啥必要呢?
pluginGroups:如果配置上,可以在执行mvn命令的时候用缩写方式,我基本上没用过该命令
servers:如果你是私服的话,在这里可以配置用户名和密码,非常有用
mirrors:镜像,啥叫镜像呢? 复制了一份自己,AI时代叫数字身份人。 举个例子吧,比如你住北京,你要去广东去进货电子产品,突然北京有一家厂商说,我这有和广东一模一样的货而且价格都一样,你肯定会选择北京对吧,因为又近又快还省钱,北京就是广东的镜像。如果mirror配置的id和Respository的id一样,会被镜像掉的,意味着Respository不生效。
profiles:
js
<profile>
<id>repository-apache-org</id>
<repositories>
<repository>
<id>repository-apache-org</id>
<name>Apache Repository</name>
<url>https://repository.apache.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<!-重点说一下这个吧,这个是仓库的更新策略,如果配置的是daily,主要本地有,一天就更新一次,我建议配置成always,每次都更新,这样能拉取到更新的-->
<updatePolicy>daily</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repository-apache-org</id>
<name>Apache Repository</name>
<url>https://repository.apache.org/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
activeProfiles:激活某个profile用的。
settings.xml就介绍到这吧,应该够你在项目中使用了。
1.2 说说 pom.xml
官方的定义
A Project Object Model or POM is the fundamental unit of work in Maven
关于pom的介绍,其实有很多文章了,今天我从项目实用的角度去聊一下是怎么使用的。 如果项目是父子项目,每个模块如何单独打包和如何做依赖管理,一一介绍一下。
依赖管理
父项目一般只有一个pom文件,专门管理jar的依赖情况,但我见过很多人把依赖管理下放到了子模块中,导致版本管理混乱,对于一个项目是否管理的妥善,我通常先看pom的依赖情况,正确的版本管理是这样的
为什么版本号的管理放到properties中呢? 一方面是一目了然的就能看到版本情况,另外如果版本号进行升级的话,非常容易修改。
在父项目中,要引入dependencyManagement 管理,子项目需要哪个引入即可。如果直接dependencies,所有的子项目都会生效,这样容易混乱。
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在pom中可以引入构建工具,比如sonar和jacoco
xml
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
</plugin>
<!--单测插件-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
除此之外,父pom里还有一个标签很重要modules,可以管理子模块。
打包
如果你想把自己的模块deploy到自己的私服上,在子模块中pom文件中可以这么配置,但千万别忘了在settings.xml中的servers中配置上用户名和密码
xml
<distributionManagement>
<repository>
<id>maven1</id>
<name>releases</name>
<url></url>
<uniqueVersion>true</uniqueVersion>
</repository>
<snapshotRepository>
<id>maven2</id>
<name>snapshots</name>
<url></url>
</snapshotRepository>
</distributionManagement>
如果你想每个子模块都打包成一个服务,该怎么做呢?
千万不要在父pom里引入构建工具,就像这样,它会把所有项目打成一个包的
你希望哪个子模块打包,只需要在该子模块配置即可
xml
<build>
<plugins>
<!--springboot 打包插件-->
<plugin>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<artifactId>spring-boot-configuration-processor</artifactId>
<groupId>org.springframework.boot</groupId>
</exclude>
</excludes>
<finalName>xxx</finalName>
<mainClass>com.xxx.Application</mainClass>
<outputDirectory>../target</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<groupId>org.springframework.boot</groupId>
</plugin>
这样就ok了。
总结
maven好用,但用不好也会非常的麻烦,maven还有一个功能就是查看依赖关系树,在同样的jar引入了不同版本时造成冲突时,该功能非常好用。