Maven配置文件settings.xml详解

2023-05-16

一、配置分级

首先需要了解的是Maven配置文件以及配置方式的分级,才能做到我们自己在日常开发配置中灵活使用。
根据Maven官方资料,Maven将配置文件分为两级:

  • 用户层级
  • 全局层级

Maven在运行的时候会merge(合并)用户层级和全局层级的配置。
Maven默认使用settings.xml作为Maven的配置文件,对应的两个层级的配置文件的路径会在

1. Maven用户层级配置文件

用户层级配置文件是提供给某个具体的用户,通常该配置文件路径为:

${user.home}/.m2/settings.xml

${user.home}是指用户目录:
在Linux、Mac系统下这个路径代表~/;在windows下是C:/Users/xxx(xxx代表你的用户名)

如果需要指定某个配置文件,可以在运行mvn时使用-s传参:

-s ${path}/xxx.xml

2. Maven全局层级配置文件

全局层级配置文件是给当前设备所有用户公用的配置文件,通常该配置文件路径为:

${maven.conf}/settings.xml

${maven.conf}是指Maven安装目录${maven.home}下的conf文件,在${maven.home}/bin/m2.conf文件里面配置的。有兴趣的可以去到自己安装Maven的目录扒一扒相关的文件信息。

同样地,如果需要指定某个配置文件作为全局配置,可以在运行mvn时使用-gs传参:

-gs ${path}/xxx.xml

二、配置文件标签对

Maven的XML配置文件是以settings标签对”包围“了整个配置文件,接下来说的配置都在这个标签对里面操作

<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 http://maven.apache.org/xsd/settings-1.0.0.xsd">          
..... 
.....
</settings>

三、本地仓库配置

Maven指定本地仓库路径,用localRepository标签对:

<localRepository>/path/to/local/repo</localRepository>

没有配置的话,默认的目录是:${user.home}/.m2/repository,也就是用户目录下的.m2文件里面。这也是Windows朋友在C盘用户目录下为什么有个.m2文件,而且还”那么占空间“。

四、指令模式(互动模式)

就是开启mvn执行中用户控制,当Maven在执行中需要输入一些操作指令或者一些参数时,会让用户输入。这个互动模式默认开启true。如果设置为false,Maven会在执行的时候采取默认值,这些默认值可能是已经有的,可能是链式默认值。配置方式如下:

<interactiveMode>true</interactiveMode>

默认开启的,我们就不用管了。

五、离线模式

这个很简单明了,官方翻译吧:确定maven在执行构建时是否应尝试连接到网络,这会对构件的下载、部署和其他操作产生影响。
默认是关闭的:false
配置方式如下:

<offline>false</offline>

六、Maven配置代理服务器

如果在使用Maven时需要指定代理服务器,则通过在proxies代理服务器列表标签对里面配置服务器
proxy标签对里面配置对应的服务器信息,通过active标签对激活配置好的代理:

<proxies>
    <proxy>
      <id>proxy-server-1</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    ...
        -->
    </proxies>

注:

  • proxies是代理列表组,proxy才是配置服务器,配置的内容大家都知道了吧,如果是socks5协议的就在protocol中设为socks5。
  • 切记,Maven会使用列表组中第一个激活的服务器作为代理服务器

七、Maven配置Nexus私服账号密码

servers标签对相信用过有分级使用权限私服的朋友都很熟悉,就是配置我们每个私服对应的账号密码或者私钥指纹
特别是公司中最常见,项目组之间各自有自己的仓库,但是不想让其他项目组的人触碰到私仓,这样在账号上面就可以做操作:指定某个账号只能访问某个仓库。(当然,有的公司是公开的,匿名者账号走遍天下,内网就行了)
回归正文:在servers列表中,我们可以根据不同的私服server(根据id区分)来配置每个私服的账号和密码。
这个id是在项目的pom.xmldistributionManagement里面配置的私服的id一致的。下面举个例子:
项目的pom.xml中使用了两个仓库,一个是snapshot的仓库(id为:cat-snapshot),一个是releases仓库(id为:cat-release),配置如下:pom.xml:

<distributionManagement>
    <repository>
        <id>cat-release</id>
        <name>RELEASES</name>
        <url>http://172.10.0.100:8081/repository/cat-releases/</url>
    </repository>

    <snapshotRepository>
        <id>cat-snapshot</id>
        <name>SNAPSHOT</name>
        <url>http://172.10.0.100:8081/repository/cat-snapshot/</url>
    </snapshotRepository>
</distributionManagement>

其中:

  • id是指上面配置仓库的ID,和下面指定的账号密码中的id一一对应
  • name是指仓库的名称
  • url本地公仓的地址

在Maven配置文件中,配上对应的账号:settings.xml

<servers>
    <server>
        <id>cat-release</id>
        <username>laomao</username>
        <password>123456</password>
    </server>
    <server>
        <id>cat-snapshot</id>
        <username>laomao</username>
        <password>123456</password>
    </server>
    ...
</servers>

其中:

  • id是指仓库的ID,这里和上面pom.xml配置的是一样的
  • username是用户名
  • password是密码

注意看id标签中的字符串是一一对应的,这个是指明了私服的账号,我这里私服中laomao账号都给了访问操作两个仓的权限,如果要灵活配置,自己可以去Nexus中配置不同账号访问不同的仓库来试试。

没有权限的话,在打包发布到私仓的时候,会提示code 401,权限不足,或者Access Denied,拒绝访问。
出现这个问题的时候,排查方法如下:

  1. 首先要确定id是否对应;
  2. 然后检查账号密码是否错误;
  3. 最后去检查私服中是否给对应的账号配置了对应私仓的权限。

八、镜像

首先,我想说下我对Maven镜像的理解:镜像是指目标仓库镜像备用库copy。配置了镜像之后,Maven会从“备用仓库”里面获取依赖,而不是目标仓库。
Maven镜像是在mirrors(镜像列表)中配置的,下面以阿里仓库作为中央仓库的镜像为例:

<mirrors>
    <mirror>
        <id>ali</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
    ...
</mirrors>

其中:

  • id是这个镜像的ID,全局唯一不能重复。
  • name是这个镜像的名称。
  • url是镜像地址,指定了从哪个地址中获取依赖。
  • mirroOf是指这个镜像对哪个库生效。

在上面的配置中,配置了阿里仓库作为Maven中央仓库(central)的镜像,获取依赖时,maven选择的是这个阿里仓库的镜像地址(上面配置的url)去获取依赖,而不是Maven官方的仓库地址。
也就是说,镜像是项目中目标仓库的备用路线,用mirrorOf标签对来指定这个镜像对应是哪个仓库,上面指定的central,是Maven官方给出的默认中央仓库的ID。如果mirrorOf中给出的是*,那就是匹配所有的仓库。

九、Maven Profile配置

1. 配置Profile

按照翻译来说profile中文是总则profile可以让我们定义一系列的配置信息,包含在profiles配置列表标签对中,每个profile配置都可以通过activeProfile命令行或者activeByDefault来激活,达到在不同的环境下自由切换配置的目的,激活的会在下面说明,先看看profile的配置。
profile可以在settings.xml中配置,也可以在pom.xml文件中配置。
注意:profile一定要给定一个全局唯一的ID,不能冲突

1.1 在settings.xml中配置profile

下面给出一个配置在settings.xmlprofile的例子:

<profile>
    <id>jdk-1.8</id>

    <activation>
        <jdk>1.8</jdk>
    </activation>

    <properties>
    ...
    </properties>

    <repositories>
        <repository>
            <id>jdk18</id>
            <name>Repository for JDK 1.8 builds</name>
            <url>http://....</url>
            <layout>default</layout>
            <snapshotPolicy>always</snapshotPolicy>
        </repository>
    </repositories>
    
    <pluginRepositories>
    ...
    </pluginRepositories>
</profile>

可以看到,配置在settings.xml中的文件并不多,主要是用于指定某个依赖仓库或者插件仓库。
其中:
activation是指激活条件,上面的例子是在jdk 1.8的环境下就会被激活。activation可以不写。

1.2 配置在pom.xml中的profile

而配置在pom.xml文件中的profile可配置项则多很多。
下面给出一个配置在pom.xmlprofile配置的例子:

<project>
    <profiles>
        <profile>
            <id>xxxx</id>
            <build>
                <defaultGoal>...</defaultGoal>
                <finalName>...</finalName>
                <resources>...</resources>
                <testResources>...</testResources>
                <plugins>...</plugins>
            </build>
            <reporting>...</reporting>
            <modules>...</modules>
            <dependencies>...</dependencies>
            <dependencyManagement>...</dependencyManagement>
            <distributionManagement>...</distributionManagement>
            <repositories>...</repositories>
            <pluginRepositories>...</pluginRepositories>
            <properties>...</properties>
        </profile>
    </profiles>
</project>

1.3 配置profile的位置选择

关于profile配置的位置,下面给点建议:

  • 特定项目的配置就在项目的pom.xml文件中配置
  • 特定用户的配置则放在用户目录下的.m2文件夹下(Windows、Linux、Mac的Maven用户目录位置在一开始有说)
  • 全局的配置则放在Maven安装目录下${maven.home}${m2.home}

再次注意:profile一定要给定一个全局唯一的ID,不能冲突

1.4 properties属性的覆盖

profile中可以定义<properties>...</properties>属性列表,如果两个属性列表中都有相同的key,如:

<profile>
    <id>profile-ID-1</id>
    ...
    <properties>
        <env>test</env>
    </properties>
    ...
</profile>    

<profile>
    <id>profile-ID-2</id>
    ...
    <properties>
        <env>dev</env>
    </properties>
    ...
</profile>   

上面两个profile中都定义了env属性,如果都没被激活或激活某一个profile的话,是没问题的。如果两个profile都被激活,那么会根据profile在配置文件中定义的位置,后面的属性会覆盖前面的属性

2. 激活profile的方式

上面说了,profile在配置之后并不是直接生效的,需要通过activeProfile命令行或者activeByDefault来激活。

2.1 在settings.xml通过activeProfile激活profile

settings.xml配置文件activeProfiles列表里通过activeProfile方式激活profile,可以激活一个或多个profile
下面给出在settings.xml同时激活两个profile的配置:

<activeProfiles> 
    <activeProfile>profile-ID-1</activeProfile> 
    <activeProfile>profile-ID-2</activeProfile>
</activeProfiles> 

注意:关于两个profile中定义相同的properties属性的情况上面有说明

2.2 使用activeByDefault激活

activeByDefault是配置在profileactivation标签对中的,上面有说了,activation是激活条件,可以在某个环境的时候触发激活该profile。而activeByDefault是在默认的状态下激活profile:

<profiles> 
    <profile> 
        ...
        <activation> 
            <activeByDefault>true</activeByDefault> 
        </activation> 
    </profile> 

    <profile> 
        ...
    </profile> 
</profiles> 

当为activeByDefault的值true的时候,表示在没有指定激活其他profile的时候,这个profile会默认被激活。如果有其他profile被指定激活之后,这个profile将不会被激活。

2.3 通过命令行管理profile激活状态

为什么说是管理,因为bash命令行可以激活,也可以取消激活某个profile

2.3.1 在运行Maven时激活

需要激活某个profile,在mvn命令中,使用参数-P来指定要激活的profile

mvn -P <profileID>

如,激活ID为profile-ID-2profile

mvn -P profile-ID-2

2.3.4 在某次mvn命令中取消使用profile

当某个profileactiveProfileactiveByDefault中被激活了,在某次mvn运行中并不需要使用该profile,但是又不想改配置那么麻烦(cd来cd去的确实很麻烦)。
可以通过命令行取消使用某个profile,用!即可达到目的:

mvn -P !<profileID>

如,在某次mvn命令中取消使用ID为profile-ID-2profile

mvn -P !profile-ID-2

附录:

1. 关于插件组pluginGroup

pluginGroup并不熟悉,后面用上了会补。

2. 关于查看Maven当前配置、pom、profile指令

之前我写了一篇文章,是关于Maven查看当前生效配置、pom、环境变量及指定使用配置文件执行命令的,会一直更新,为了一致性这里就不复述了:
简书:https://www.jianshu.com/p/6184fa25fd53
CSDN:https://blog.csdn.net/nthack5730/article/details/82385124


此文同时在简书发布:https://www.jianshu.com/p/32f348dbf3d4
此文同时在CSDN发布:https://blog.csdn.net/nthack5730/article/details/84590027
转载要加原文链接!谢谢支持!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Maven配置文件settings.xml详解 的相关文章

  • Maven:如何确保在类路径中使用带时间戳的快照版本?

    我希望我们的功能测试使用类路径中快照的时间戳版本 例如 api 0 5 0 20110706 191935 1 jar 从 Maven 运行 然而 虽然我可以看到我们的 Artifactory 存储库中有带时间戳的版本 但 Maven 指的
  • Maven:如何获取捆绑在包中的 .so 库

    我有一个带有 jar 和 so 文件的第三方库 我配置了 pom xml 如下
  • 横向模式下视频视图不是全屏

    我正在使用用 xml 设计的视频视图 该视频在纵向模式下为全屏 但当切换到横向模式时 它会左对齐 并且宽度和高度都会换行 而不是全屏 我参考了这些 但仍然没有解决这个问题 全屏视频视图未居中 https stackoverflow com
  • 如何修复安装 maven jar 插件依赖项时出现的错误?

    我正在将应用程序制作成 maven 中的 jar 文件 但是 当我从 Maven 中提取 jar 插件存储库并在终端中运行这三个命令时 mvn clean mvn compile mvn package 在 mvn package 中 我收
  • Dcucumber.options,如何拥有多个标签

    我正在尝试使用 Maven 使用以下命令运行黄瓜测试 mvn test Dcucumber options tag debug1 这个命令工作正常 但是如果我尝试类似以下的操作 我会收到错误 mvn test Dcucumber optio
  • Odoo:使得无法在树视图中编辑记录?

    在 Odoo 中 您可以使其无法从树视图中创建或删除记录 如下所示
  • XML 和 INI 哪个更快?

    我想知道 XML 是否比 INI 更快 反之亦然 我正在开发一个包含许多文件的网站 这个问题与我的问题有关关于包含许多文件 https stackoverflow com questions 7777522 too many include
  • 批量修改XML文件

    好的 所以我不太熟悉使用 For F 如果文件是静态的并且有一组可以跳过然后从中提取数据的行 我可以修改它 我目前正在尝试修改 XML 文件 该文件将具有不同数量的行 但始终具有以下内容
  • 如何仅从 XML 生成 JAXB 类

    我需要从不提供架构的 xml 生成类 我知道这几乎没有用 但事实是我们有 xml 它是结构化的 我们应该能够从 xml 创建模型 过去我都是手工完成的 但是当前我正在使用的 xml 文档非常大 我的时间可能会更好地花在构建满足我需要的东西上
  • 在代码后面绑定属性

    我有 WPF 应用程序和其中的一个窗口 让我们在我的 xml 中添加这样的内容
  • 如何在 PHP Soap 客户端中禁用命名空间别名?

    我的 PHP Microsoft AX 集成有问题 我正在使用 SOAP WSDL 与服务集成 我遇到的问题是在从 PHP 向 WSDL 发送请求后收到此错误 无效的实例类型名称 ns3 AxdEntity DirParty DirOrga
  • 将 Java 对象图保存为 XML 文件

    将任意 Java 对象图保存为 XML 文件 并能够在以后重新水合对象 的最简单易用的技术是什么 这里最简单的方法是序列化对象图 Java 1 4 内置了对 XML 序列化的支持 我成功使用的一个解决方案是 XStream http x s
  • XAMARIN - 添加来自 youtube 的视频

    我搜索如何从 youtube 添加视频的信息 例如 我想从一些 YouTube 链接添加视频 我认为它应该在网络视图中 但我需要一些详细信息 因为我找不到有关我的问题的任何信息 您可以使用 webview 播放 youtube 视频 str
  • Maven 部署:deploy-file 发布所有文件而不是一个

    我正在使用 Maven 构建我的 Java 应用程序Maven 组装插件 https maven apache org plugins maven assembly plugin 创建一个可执行的 jar 因此 目标文件夹包含多个 jar
  • 由带有换行符的 DOMDocument 生成的 XML

    我正在使用 PHP DOMDocument 创建 XML 文件 并且这些 XML 文件不能包含换行符 但是当我使用该方法时 保存 XML 生成的 XML 在定义和初始标记之间有一个换行符 如下所示
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 在 iPhone 应用程序中显示来自 RSS 源的内容

    我看过一些关于这个主题的教程 但它们都只讨论了一半 然后让人感到困惑 如何将 RSS feed 流式传输到 iPhone 应用程序中 我知道 xml 应该被读入 解析等 但随后我不确定如何显示我需要的信息 例如图像 嵌入视频等 如果有人能指
  • 将 XML 的所有字段(和子字段)导入为数据框

    为了进行一些分析 我想使用 R 和 XML 包将 XML 导入数据帧 XML 文件示例
  • 如何判断手机是否有刘海

    如果存在缺口 我需要修改应用程序的工具栏 现在 该凹口隐藏了工具栏中的一些内容 if Build VERSION SDK INT Build VERSION CODES LOLLIPOP Build VERSION SDK INT Buil
  • 如何在Intellij IDEA中复制maven依赖项到输出工件WEB-INF/lib?

    我知道在 eclipse maven 中可以将依赖项复制到 WEB INF lib 目录setting Deployment Assembly and Build Path 但是我怎样才能用 Intellij IDEA 实现这一点呢 好的

随机推荐