聊聊settings.xml和pom.xml

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中找不到,就会去默认中心仓去找。

仓库服务 (aliyun.com)

我去阿里云的仓库一看果然不存在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引入了不同版本时造成冲突时,该功能非常好用。

相关推荐
Tech Synapse1 小时前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴1 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since811921 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails
代码吐槽菌3 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
豌豆花下猫3 小时前
Python 潮流周刊#78:async/await 是糟糕的设计(摘要)
后端·python·ai
YMWM_3 小时前
第一章 Go语言简介
开发语言·后端·golang
码蜂窝编程官方3 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
hummhumm4 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
J老熊4 小时前
JavaFX:简介、使用场景、常见问题及对比其他框架分析
java·开发语言·后端·面试·系统架构·软件工程
AuroraI'ncoding4 小时前
时间请求参数、响应
java·后端·spring