Maven配置文件setings.xml详解&依赖搜索顺序详解

Maven配置文件详解

文章目录

一、settings.xml配置文件的作用

①Maven目录下(全局配置):${maven.home}/conf/setting.xml(可以用 mvn -v 命令查看安装的目录位置)

②用户目录下(用户级配置):${user.home}/.m2/settings.xml(查 ~/.m2/settings.xml)

配置优先级从高到低:项目pom.xml > user settings > global settings

二、settings.xml元素详解

0.示例
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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">
 
    <localRepository>/Users/***/***/repos</localRepository>
    <interactiveMode>true</interactiveMode>
    <usePluginRegistry>false</usePluginRegistry>
    <offline>false</offline>
  
    <pluginGroups>
      <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
    <servers>
        <server>
            <id>nexus_server_id</id>
            <username>my_login</username>
            <password>my_password</password>
            <privateKey>${user.home}/.ssh/id_dsa</privateKey>
            <passphrase>some_passphrase</passphrase>
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
            <configuration></configuration>
        </server>
    </servers>
    <mirrors>
        <mirror>
            <id>nexus-aliyun</id>
            <name>Nexus aliyun</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>*</mirrorOf>
        </mirror>
    </mirrors>
        <proxies>
          <proxy>
             <id>myproxy</id>
             <active>true</active>
             <protocol>http</protocol>
             <host>proxy.somewhere.com</host>
             <port>8080</port>
             <username>proxyuser</username>
             <password>somepassword</password>
             <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
         </proxy>
        </proxies>
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
              <activeByDefault>false</activeByDefault>
              <jdk>1.5</jdk>
              <os>
                <name>Windows XP</name>
                <family>Windows</family>
                <arch>x86</arch>
                <version>5.1.2600</version>
              </os>
              <property>
                <name>mavenVersion</name>
                <value>2.0.3</value>
              </property>
              <file>
                <exists>${basedir}/file2.properties</exists>
                <missing>${basedir}/file1.properties</missing>
              </file>
            </activation>
            <repositories>
                <repository>
                    <id>ccl-nexus</id>
                    <url>http://*.*.*.*:8081/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                        <updatePolicy>always</updatePolicy>
                        <checksumPolicy>warn</checksumPolicy>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                        <updatePolicy>never</updatePolicy>
                        <checksumPolicy>fail</checksumPolicy>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>ccl-nexus</id>
                    <url>http://*.*.*.*:8081/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>
        <profile>
            <id>test</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
              <test.jdbc.url>
                jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
              </test.jdbc.url>
              <sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</test.jdbc.driverClassName>
              <test.jdbc.username>root</test.jdbc.username>
              <test.jdbc.password></test.jdbc.password>
              <test.host.url>http://*.*.*.*:80</test.host.url>
            </properties>
        </profile>     
    </profiles>
    <activeProfiles>
        <activeProfile>dev</activeProfile>
    </activeProfiles>
   
</settings>
1.LocalRepository

构建系统本地仓库的路径。其默认值为~/.m2/repository

xml 复制代码
<!-- 默认值是${user.home}/.m2/repository -->
<localRepository>E:/project/localRepository</localRepository>
2.InteractiveMode

在 Maven 的配置文件(通常是 settings.xml 文件)中,<interactiveMode> 元素用于控制 Maven 是否以交互模式运行。

<interactiveMode> 设置为 true 时,Maven 将在执行构建过程时向用户显示一些提示信息,并等待用户输入或确认某些操作。这样可以使用户能够根据需要进行选择或交互。

例如,当 Maven 构建一个项目时,如果设置了交互模式,它可能会提示用户选择特定的构建配置、确认下载依赖项、发布构件等。

然而,当 <interactiveMode> 设置为 false 时,Maven 将在构建过程中自动进行操作,不会等待用户输入或交互。这对于自动化构建或持续集成等场景非常有用。

默认情况下,Maven 的 <interactiveMode> 设置为 true,即启用交互模式。如果您希望禁用交互模式并使 Maven 在构建过程中自动进行操作,则可以将 <interactiveMode> 设置为 false

xml 复制代码
<settings>
  ...
  <interactiveMode>false</interactiveMode>
  ...
</settings>

如果为false,命令如下 mvn archetype:generate -DgroupId=com.zworks -DartifactId=maven-setting -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

需要指定groupId、artifactId、archetypeArtifactId,如果不指定会报错,因为这些是无法推测出值的。

如果为true,命令如下 mvn archetype:generate

后面会让你选择或输入archetype、groupId、artifactId、version、package、为false的时候之所以不用指定version和package是因为这两个都有默认值。

3.UsePluginRegistry

Maven是否需要使用plugin-registry.xml文件来管理插件版本。如果需要让Maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true。默认为false。

xml 复制代码
 <!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false -->
<usePluginRegistry>false</usePluginRegistry>
4.Offline

表示Maven是否需要在离线模式下运行。如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。

xml 复制代码
<!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 -->
<offline>false</offline>
5.PluginGroups

当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo

xml 复制代码
<!--插件组
    在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。
    pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。-->
    <pluginGroups>
      <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
    <!--例如,有了上面的配置,Maven命令行可以使用简单的命令执行org.morbay.jetty:jetty-maven-plugin:run,如下:
    mvn jetty run
    -->
6.Servers

用来下载和部署的仓库是用POM中的repositories和distributionManagement元素来定义的。 但是某些配置例如username和password就不应该随着pom.xml来分配了。这种类型的信息应该保存在构建服务器中的settings.xml中。

xml 复制代码
<!--服务器
用来下载和部署的仓库是用POM中的repositories和distributionManagement元素来定义的。
但是某些配置例如username和password就不应该随着pom.xml来分配了。这种类型的信息应该保存在构建服务器中的settings.xml中。
-->
<servers>
    <server>
    <!-- 这是Server的ID(不是登录进来的user),与Maven想要连接上的repository/mirror中的id元素相匹配。 -->
        <id>nexus_server_id</id>
        <username>my_login</username>
        <password>my_password</password>
    <!-- 与前两个元素一样,这两个成对出现,分别指向了一个私钥(默认的${user.home}/.ssh/id_dsa)和一个passphrase。即分别表示私钥位置和私钥密码 -->
        <privateKey>${user.home}/.ssh/id_dsa</privateKey>
        <passphrase>some_passphrase</passphrase>
    <!-- 文件和目录被创建时的权限。后续需要用此权限来访问。
            这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 -->
        <filePermissions>664</filePermissions>
        <directoryPermissions>775</directoryPermissions>
    <!-- 传输层额外的配置项 -->
        <configuration></configuration>
    </server>
</servers>
7.Mirrors

为仓库列表配置的下载镜像列表

  • <mirror>:表示一个镜像的配置信息。
  • <id>:表示该镜像的唯一标识符,通常使用一个具有描述性的名称来命名。
  • <name>:表示该镜像的名称,通常使用一个简短的描述来命名。
  • <url>:表示该镜像所在的URL地址。
  • <mirrorOf>:表示该镜像要代理哪些其他的仓库或者镜像。这里的*表示代理所有的仓库,镜像配置中的<mirrorOf>元素非常重要,它决定了哪些仓库或者镜像会被代理到该镜像上。如果不设置<mirrorOf>元素,那么该镜像将不会生效。在这个例子中,使用了通配符*表示代理所有的仓库

如果在<mirrors>中配置了多个<mirror>,Maven会按照配置文件中的顺序依次遍历这些镜像,直到找到一个匹配的镜像为止。具体来说,Maven会按照以下步骤进行处理:

  1. 首先,Maven会按照<mirrors>中镜像的顺序遍历所有的<mirror>元素,查找是否有与当前请求匹配的<mirror>元素。
  2. 如果找到了匹配的<mirror>元素,则Maven会使用该<mirror>元素中指定的URL地址进行访问。
  3. 如果找不到匹配的<mirror>元素,则Maven会使用默认的仓库地址进行访问。

需要注意的是,不同的<mirror>元素可以覆盖前面的<mirror>元素,因此建议将使用频率较高的镜像放在前面,以提高效率。另外,在配置多个镜像时,可以使用<mirrorOf>元素指定每个镜像代理的仓库范围,以减少冗余访问和网络带宽的消耗。

xml 复制代码
<mirrors>
    <mirror>
        <!-- 镜像标识id -->
        <id>nexus-aliyun</id>
        <name>Nexus aliyun</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <!-- 指向此镜像的仓库Id,任何对于远程仓库的请求都会被转至此url。
                    多个逗号隔开,或者*号统配,或者!排除某个之外的所有仓库
        external:*匹配除使用 localhost 或基于文件的存储库之外的所有存储库。当您想要排除为集成测试定义的重定向存储库时使用。
        自 Maven 3.8.0 起,external:http:*匹配所有使用 HTTP 的存储库,但使用 localhost 的存储库除外。
        * = 一切
        external:* = 一切不在本地主机上,也不基于文件。
        repo,repo1 = repo或repo1
        *,!repo1 = 除了 repo1 之外的所有东西
            注意不要在逗号分隔列表中的标识符或通配符周围包含额外的空格。
            例如,<mirrorOf设置为 >的镜像!repo1, *不会镜像任何内容,而!repo1,*会镜像除repo1
            注意多个mirrorOf内容相同并不会都生效,每个仓库只能有一个镜像,Maven 不会聚合镜像,而只是选择第一个匹配项
            -->
        <mirrorOf>*</mirrorOf>
    </mirror>
</mirrors>
8.Proxies
  • <proxy>:表示一个代理服务器的配置信息。

  • <id>:表示该代理的唯一标识符,通常使用一个具有描述性的名称来命名。

  • <active>:表示该代理是否启用,"true"表示启用,"false"表示禁用。

  • <protocol>:表示该代理服务器的协议类型,例如"http"、"https"等。

  • <host>:表示该代理服务器的主机名或IP地址。

  • <port>:表示该代理服务器的端口号。

  • <username><password>:表示连接代理服务器时的认证信息,用于身份验证。

  • <nonProxyHosts>:表示不需要通过代理访问的主机名列表。可以使用竖线"|"或逗号","作为分隔符。

    在Maven中,你可以配置多个代理服务器来适应不同的网络环境。当Maven进行网络请求时,它会按顺序检查每个代理配置,并使用第一个匹配请求的配置。因此,你可以按照特定的优先级顺序配置代理,以确保在不同网络环境下能够正确地连接到代理服务器。

xml 复制代码
在这个例子中,配置了一个名为"myproxy"的代理服务器,使用HTTP协议连接到主机"proxy.somewhere.com"的8080端口。同时,提供了连接代理服务器时的认证信息(用户名和密码),以及不需要通过代理访问的主机名列表(*.google.com和ibiblio.org)。

<proxies>
  <proxy>
     <id>myproxy</id>
     <active>true</active>
     <protocol>http</protocol>
     <host>proxy.somewhere.com</host>
     <port>8080</port>
     <!-- 两个元素成对出现,提供连接proxy服务器时的认证 -->
     <username>proxyuser</username>
     <password>somepassword</password>
     <!--不该被代理的主机名列表。该列表的分隔符由代理服务器指定;例子中使用了竖线分隔符,使用逗号分隔也很常见。-->
     <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
 </proxy>
</proxies>
9.Profiles

settings.xml中的profile是pom.xml中的profile的简洁形式。 它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。 profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。 如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。

  1. id
    • 作用:用于定义profile的唯一标识符,可以通过该id引用profile。
  2. activation
    • 作用:用于指定何时激活profile,可以根据不同的条件来激活profile,例如环境变量、操作系统、Java版本等。activation标签可以包含如下子标签:
      • activeByDefault:指定是否默认激活profile。
      • jdk:指定所需的JDK版本。
      • os:指定操作系统条件。
      • property:指定属性条件。
      • file:指定文件是否存在条件。
  3. properties
    • 作用:用于定义profile特定的属性,这些属性将覆盖全局属性或pom.xml中定义的属性。
  4. dependencies
    • 作用:在profile中可以定义特定的依赖,这些依赖只会在激活了该profile的情况下被添加到项目中。
  5. build
    • 作用:允许在profile中重新定义构建配置,包括插件、资源目录、输出目录等。
  6. repositories
    • 作用:定义profile特定的仓库地址,这些仓库地址只会在激活了该profile的情况下被使用。
  7. pluginRepositories
    • 作用:类似repositories标签,定义profile特定的插件仓库地址。
  8. modules
    • 作用:定义profile特定的模块列表,这些模块只会在激活了该profile的情况下被构建。
  9. distributionManagement
    • 作用:允许在profile中重新定义分发管理配置,包括部署仓库地址、站点生成配置等。
xml 复制代码
<!--配置文件
    settings.xml中的profile是pom.xml中的profile的简洁形式。
    它包含了激活(activation),仓库(repositories),插件仓库(pluginRepositories)和属性(properties)元素。
    profile元素仅包含这四个元素是因为他们涉及到整个的构建系统,而不是个别的POM配置。
    如果settings中的profile被激活,那么它的值将重载POM或者profiles.xml中的任何相等ID的profiles。
    -->
<profiles>
    <profile>
        <id>dev</id>
        <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。
            如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;
            这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。
            settings.xml文件中的activeProfile元素可以设置需要激活profile的id。
            profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。-->
          <activation>
          <!-- 默认激活的标识 -->
          <activeByDefault>false</activeByDefault>
          <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。-->
          <jdk>1.5</jdk>
          <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。-->
          <os>
            <!--激活profile的操作系统的名字 -->
            <name>Windows XP</name>
            <!--激活profile的操作系统所属家族(如 'windows')  -->
            <family>Windows</family>
            <!--激活profile的操作系统体系结构  -->
            <arch>x86</arch>
            <!--激活profile的操作系统版本-->
            <version>5.1.2600</version>
          </os>
          <!--如果Maven检测到某一个属性(其值可以在POM中通过${name}引用),其满足对应的name = 值,Profile就会被激活。
                        如果值字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段-->
          <property>
            <name>mavenVersion</name>
            <value>2.0.3</value>
          </property>
          <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活profile。
                        另一方面,exists则会检查文件是否存在,如果存在则激活profile。-->
          <file>
            <!--如果指定的文件存在,则激活profile。 -->
            <exists>${basedir}/file2.properties</exists>
            <!--如果指定的文件不存在,则激活profile。-->
            <missing>${basedir}/file1.properties</missing>
          </file>
        </activation>
        <!--如果以上所有指定的条件都达到了,那么,activation就被触发,而且不需要一次性全部达到。-->
        <!--仓库(repositories)
        仓库是Maven用来构筑构建系统的本地仓库的远程项目集合。它来自于被Maven叫做插件和依赖的本地仓库。
                    不同的远程仓库包含不同的项目,当profile被激活,他们就会需找匹配的release或者snapshot构件。 -->
        
        <!--插件仓库(plugin repositories)
        仓库包含了两种重要类型的构件:第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。
                    Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。
                    pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。
        -->
    </profile>
</profiles>
10.Activation

自动触发profile的条件逻辑。Activation是profile的开启钥匙。如POM中的profile一样,profile的力量来自于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)

xml 复制代码
<activeProfiles>
    <activeProfile>dev</activeProfile>
</activeProfiles>
11.properties

Maven的属性是值占位符,就像Ant中的属性。如果X是一个属性的话,那么它的值在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从settings.xml文件中访问到。

env.X:使用"env."前缀将会返回当前的环境变量。例如 e n v . P A T H 就是使用了 {env.PATH}就是使用了 env.PATH就是使用了path环境变量。

project.X:一个点"."分割的路径,在POM中就是相关的元素的值。例如:1.0就可以通过 p r o j e c t . v e r s i o n 来访问。 s e t t i n g s . X :一个点" . "分割的路径,在 s e t t i n g s . x m l 中就是相对应的元素的值,例如: < s e t t i n g s > < o f f l i n e > f a l s e < / o f f l i n e > < / s e t t i n g s > 就可以通过 {project.version}来访问。 settings.X:一个点"."分割的路径,在settings.xml中就是相对应的元素的值,例如:<settings><offline>false</offline></settings>就可以通过 project.version来访问。settings.X:一个点"."分割的路径,在settings.xml中就是相对应的元素的值,例如:<settings><offline>false</offline></settings>就可以通过{settings.offline}来访问。

Java系统属性:所有通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如: j a v a . h o m e X :被 < p r o p e r t i e s / > 或者外部文件定义的属性,值可以这样访问 {java.home} X:被<properties/>或者外部文件定义的属性,值可以这样访问 java.homeX:被<properties/>或者外部文件定义的属性,值可以这样访问{someVar}

xml 复制代码
<properties>
  <test.jdbc.url>
    jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
  </test.jdbc.url>
  <test.jdbc.driverClassName>com.mysql.jdbc.Driver</test.jdbc.driverClassName>
  <test.jdbc.username>root</test.jdbc.username>
  <test.jdbc.password></test.jdbc.password>
  <test.host.url>http://172.16.11.43:80</test.host.url>
</properties>
12.Repositories

远程仓库列表,它是Maven用来填充构建系统本地仓库所使用的一组远程项目

其中配置参数:

  1. <id>:仓库的唯一标识符。
  2. <url>:仓库的位置(URL)
  3. <layout>:仓库的布局类型,默认为 default
  4. <releases>:配置与发布版本相关的选项。
    • <enabled>:指定是否启用该仓库的发布版本,默认为 true
    • <updatePolicy>:指定检查更新策略,如 alwaysdailyinterval:X 等。
    • <checksumPolicy>:指定验证校验和的策略,如 ignorewarnfail 等。
  5. <snapshots>:配置与快照版本相关的选项
    • <enabled>:指定是否启用该仓库的快照版本,默认为 false
    • <updatePolicy>:指定检查更新策略,如 alwaysdailyinterval:X 等。
    • <checksumPolicy>:指定验证校验和的策略,如 ignorewarnfail 等。
  6. <authentication>:配置仓库的认证信息
    • <username>:仓库的用户名。
    • <password>:仓库的密码。
    • <privateKey>:仓库的私钥。
    • <passphrase>:私钥的密码(如果有的话)。
  7. <proxy>:配置代理服务器信息
    • <id>:代理服务器的唯一标识符。
    • <active>:指定是否启用该代理服务器,默认为 false
    • <protocol>:代理服务器的协议,如 httphttps
    • <host>:代理服务器的主机名。
    • <port>:代理服务器的端口号。
    • <username>:代理服务器的用户名。
    • <password>:代理服务器的密码。
xml 复制代码
<repositories>
    <repository>
        <id>ccl-nexus</id>
        <url>http://172.16.10.99:8081/nexus/content/groups/public</url>
        <!--如何处理远程仓库里发布版本的下载-->
        <releases>
            <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。  -->
            <enabled>true</enabled>
            <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。
                选项是:always(一直),
                daily(默认,每日),
                interval:X(这里X是以分钟为单位的时间间隔),
                never(从不)。 -->
            <updatePolicy>always</updatePolicy>
            <!--当Maven验证构件校验文件失败时该怎么做-ignore(忽略),fail(失败),或者warn(警告)。-->
            <checksumPolicy>warn</checksumPolicy>
        </releases>
        <!--如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,
            POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。
            例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素-->
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
        </snapshots>
    </repository>
</repositories>
13.pluginRepositories

发现插件的远程仓库列表。仓库是两种主要构件的家。第一种构件被用作其它构件的依赖。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件。Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。

xml 复制代码
<!--插件仓库(plugin repositories)
仓库包含了两种重要类型的构件:第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。
            Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。
            pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。
-->
<pluginRepositories>
    <pluginRepository>
        <id>ccl-nexus</id>
        <url>http://127.0.0.1:8081/nexus/content/groups/public</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>
14.ActiveProfiles

手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。 该元素包含了一组activeProfile元素,每个activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。

xml 复制代码
<!--激活配置(Active Profiles)-->
<activeProfiles>
  <activeProfile>dev</activeProfile>
</activeProfiles>

三、maven查找依赖的顺序概述:

①maven三类仓库说明
  • 本地仓库(local)

本地仓库是 Maven 在本地机器上存储依赖项的地方。当你构建一个 Maven 项目时,Maven 会自动从中央仓库或其他远程仓库下载所需的依赖项,并将其存储在本地仓库中。这样,下次需要使用相同依赖时,Maven 就可以直接从本地仓库中获取而不必重新下载。

默认情况下,本地仓库位于用户主目录下的 .m2 目录中。你可以通过 settings.xml 文件中的 <localRepository> 元素来指定本地仓库路径。

  • 中央仓库(central)

中央仓库是 Maven 官方维护的一个仓库,包含了大量的开源 Java 项目的依赖项。当你在项目中声明了依赖项时,Maven 会自动从中央仓库下载所需的依赖项。

中央仓库中的所有内容都是公共可用的,因此任何人都可以访问其中的依赖项。如果你在使用 Maven 构建 Java 项目,那么中央仓库会是你最常用的仓库之一。

  • 远程仓库(remote)

远程仓库是 Maven 中除了本地仓库和中央仓库之外的其他仓库。通常,一个企业或组织会自己搭建远程仓库来存储自己的私有依赖项或第三方依赖项,以便全公司或团队共享使用。

当你在项目中声明了依赖项时,如果中央仓库中没有对应的依赖项,Maven 就会尝试从所配置的远程仓库中下载该依赖项。你可以在 settings.xml 文件中的 <mirrors> 元素中配置镜像仓库,以便加速依赖项下载。

②配置文件类型以及覆盖关系

配置文件类型:

  • 项目级(Per Project):定义在项目POM.XML文件中
  • 用户级(Per User):定义在Maven的设置xml文件(${user.home}/.m2/settings.xml)
  • 全局(Global):定义在Maven全局的设置xml文件中(${maven.home}/conf/setting.xml)

覆盖关系说明:

上述配置文件类型优先级从上到下,即如果有相同的配置信息,项目级的配置覆盖用户级配置信息,用户级配置信息覆盖全局配置信息,Profile中的配置会覆盖Profile外的配置。

在 Maven 的多模块项目中,如果子模块POM中重写了父模块中的配置,子模块的配置会覆盖父模块的配置。

③依赖管理(不涉及模块的聚合和继承):

**依赖:**项目所需的外部库、框架或其他项目的引用。这些依赖项会在构建过程中自动下载并添加到项目的类路径中,使得项目能够正常编译、运行和测试。示例:

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>dependency1</artifactId>
        <version>1.0.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>dependency2</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

**依赖属性:**POM 文件中的依赖通常以 XML 元素的形式列出,其中包括依赖项的坐标(groupId、artifactId、version)、Scope、Optional 等属性:

  • groupId:定义依赖项的组织或项目组的唯一标识符。通常以反向域名的形式命名,例如 com.example。

  • artifactId:定义依赖项的唯一标识符。它通常是项目或库的名称,例如 dependency1。

  • version:定义依赖项的版本号。Maven 使用版本号来确定要使用的依赖项版本。

  • scope:定义依赖项的可见性和生命周期。常用的 scope 有:

    作用范围:

    • compile:默认的 scope,表示依赖项在编译、测试和运行时都需要使用。

    • test:表示依赖项仅在测试阶段使用,不会包含在最终构建的包中。

    • runtime:表示依赖项仅在运行时使用,而不是编译时。

    • provided:表示依赖项由 JDK 或容器提供,不需要在编译或运行时包含在项目中。

    • system:类似于 provided,但需要明确指定依赖项的路径。

    Scope 主程序范围 测试程序范围 是否打包 范例
    Compile(默认) Y Y Y Log4j
    Test Y Junit
    Provided Y Y Serveet-api
    Runtime Y Jdbc

    依赖范围传递性:

    带有依赖范围的资源在进行传递时,作用范围将受到影响,行:直接依赖,列:间接依赖

    如package1中依赖了package2,package2中配置了依赖1,依赖1的scope是runtime,如果package1依赖package2的scope是test,那么其传递过来的依赖1的scope是test;

    如package1中依赖了package2,package2中配置了依赖1,依赖1的scope是test,如果package1依赖package2的scope是test,那么package1就无法传递获得依赖1;

    Compile Test Provided Runtime
    Compile Compile Test Provided Runtime
    Test
    Provided
    Runtime Runtime Test Provided Runtime
  • optional:定义依赖项是否是可选的。可选依赖项不会强制要求用户将其包含在项目中。

  • exclusions:定义需要排除的传递性依赖项。可以指定一些依赖项,以防止它们被传递性地引入到项目中。

  • type:定义依赖项的类型。常见的类型有 JAR、WAR、POM 等。

  • classifier:对于同一 artifactId 和 version 的不同构建或版本,可以使用 classifier 进行区分。

    具体示例,有一个项目需要同时使用 Log4j 1.x 和 Log4j 2.x 版本的库。这两个版本的 artifactId 和 groupId 都是相同的,所以无法通过这些属性来区分它们。但是,这两个版本的 JAR 包文件名有所不同,Log4j 1.x 版本的文件名为 log4j-1.2.17.jar,而 Log4j 2.x 版本的文件名为 log4j-api-2.14.1.jar。在这种情况下,可以使用 classifier 属性区分这两个版本,Log4j 1.x 版本的库被配置为 org.apache.logging.log4j:log4j:1.2.17:legacy,其中 legacy 是自定义的 classifier,用于区分 Log4j 1.x 版本。这样,项目就可以同时使用 Log4j 1.x 和 Log4j 2.x 版本的库,并且 Maven 会根据需要自动解析和下载相应版本的库。

    xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <classifier>legacy</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>

重复依赖:

当在 Maven 的 pom.xml 文件中多次声明相同的依赖时,Maven 会根据以下规则处理这些重复的依赖

  1. 第一个声明的依赖会被保留,后续相同的依赖声明会被忽略。Maven 不会重复下载和处理已经存在的依赖项。
  2. 如果多个相同依赖的声明具有不同的版本号,则 Maven 将使用声明中的最后一个版本。这意味着最后一次声明的版本将覆盖之前的版本。
  3. 如果多个相同依赖的声明具有相同的版本号,那么 Maven 不会做任何特殊处理,它们都将被视为同一个依赖,并且只会下载一次。

使用相同的依赖声明多次可能是不必要的,并且会增加构建时间和项目大小。因此,建议在 pom.xml 文件中只声明一次所需的依赖,并确保版本号的一致性。如果需要引入不同版本的依赖,可以通过调整项目结构或使用 Maven 提供的解决依赖冲突的机制来解决

传递依赖:

依赖具有传递性:

  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。

依赖传递冲突问题:

由于依赖具有传递性,那么可能一个项目中可能存在多个相同的依赖,那么我们其使用依赖是哪一个呢?

  • 路径优先(就近原则):当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高。
  • 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。
  • 特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

可选依赖(不透明):

可选依赖指对外隐藏当前所依赖的资源------不透明。

即在A加依赖B的时候,如果B的某个依赖的标签的值是true,那么B的该依赖对A隐藏。

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>dependency1</artifactId>
        <version>1.0.0</version>
        <optional>true</optional>
    </dependency>
</dependencies>

排除依赖(不需要):

排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。

通过和来实现

xml 复制代码
<dependency>
	<groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>artifactIeamcrest-core</artifactId>
		</exclusion>
	</exclusions>
</dependency>
④pom模块的聚合和继承:

聚合:

聚合的作用: 聚合用于快速构建maven工程,一次性构建多个项目/模块。

**多模块的构建维护:**在进行模块拆分后,如果某一个模块更新后,那么其他的模块都会因为该模块的原因而无法成功运行。那么我们这个时候就需要一个模块去统一管理这些模块,去负责这些模块的编译等功能(由该模块的功能执行,来对这些拆分的模块进行统一的功能执行),一个模块的活动对其他模块透明。

创建的方式:

  1. 创建一个空模块,打包类型定义为pom(一般是父模块)

    xml 复制代码
    <packaging>pom</packaging>
  2. 定义当前模块进行构建操作时关联的其他模块名称

    <!--管理的工程列表-->
    <modules>
    	<!--具体的工程名称-->
    	<module>../pojo1</module>
    	<module>../pojo2</module>
    	<module>../pojo3</module>
    	<module>../pojo4</module>
    </modules>
    

    然后我们执行该继承模块的编译,可以发现其管理的模块依次执行编译操作,其顺序是根据依赖的顺序,从底到外进行依次执行的,如果并列的话,是根据配置的顺序进行执行的。

    注意:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关

继承:

通过继承可以实现子工程中沿用父工程的配置

⑤仓库依赖查找的顺序:
https://www.jianshu.com/p/4ac4155b7cc3
https://blog.csdn.net/lishuoboy/article/details/119887006

maven项目中使用的仓库一共有有如下:

  • 中央仓库 ------ ①

    Maven 默认已经配置了中央仓库,你无需手动进行配置,默认的中央仓库URL为https://repo.maven.apache.org/maven2

    如果需要使用自定义的中央仓库,可以在setting.xml文件中添加<mirror>元素,如下图所示

    xml 复制代码
    <mirrors>
      <mirror>
        <id>aliyun-central</id>
        <name>Aliyun Maven Mirror</name>
        <url>https://maven.aliyun.com/repository/central</url>
        <mirrorOf>central</mirrorOf>
      </mirror>
    </mirrors>

    <mirrorOf> 设置为 central 时,这意味着你正在覆盖默认的中央仓库设置,这样的配置会告诉 Maven 当访问中央仓库时,使用你指定的镜像仓库地址,而不再使用默认的中央仓库地址。

  • 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置 ------ ②

    就是一个备份或冗余.并且你有的我也有并且我比你快,用镜像仓库替代默认的远程仓库。

  • 全局仓库,通过 settings.xml 中的 settings.repositories.repository 配置 ------ ③

  • 全局profile仓库,通过 settings.xml 中的 settings.profile.repositories.repository 配置 ------ ④

  • 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置 ------ ⑤

  • 项目profile仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置 ------ ⑥

  • 本地仓库 ------ ⑦

    如果没有通过LocalRepository配置本地仓库路径,Maven 默认会将本地仓库存储在用户的主目录下的 .m2 目录中

    • Windows:C:\Users\{用户名}\.m2
    • macOS/Linux:/Users/{用户名}/.m2

仓库分类:

本地仓库:⑦本地仓库

远程仓库:⑥项目profile仓库、⑤项目仓库、 ④全局profile仓库、③全局仓库、②镜像仓库【镜像仓库属于对中央仓库和其他远程仓库的镜像副本,本质上是远程仓库的一种形式,用于提供更高效的依赖下载】

中央仓库:①中央仓库

仓库依赖优先级:

即当重复配置仓库的时候,所生效的仓库,其顺序如下:

⑦本地仓库 -> ⑥项目profile仓库 -> ⑤项目仓库 -> ④全局profile仓库 -> ③全局仓库 -> ②镜像仓库 -> ①中央仓库

仓库查找依赖/插件顺序优先级:

本地仓库 -> 全局激活profile中的仓库 -> 用户激活profile中的仓库 -> 项目激活profile中的仓库 ->项目仓库 -> 用户级别设置的仓库 -> 全局仓库 -> 用户级别的镜像 -> 全局镜像

说明:

全局级别:Maven目录下,${maven.home}/conf/setting.xml

用户级别:用户目录下,${user.home}/.m2/settings.xml

项目界别:项目中的pom文件,pom.xml

这里特殊的是镜像仓库,镜像仓库在配置的时候通过mirrorOf标签匹配唯一的仓库id(如maven中央仓库id是central,在super pom中配置,当然还有各种各样自定义的仓库也有id),当远程仓库被镜像匹配到的,则在获取依赖的时候将从镜像仓库获取,而不是我们配置的repository仓库,此时repository仓库就是去作用。

四、其他

①定义在settings中的repositories和定义在profile中的repositories的区别

在Maven中,<repositories> 元素可以放置在两个不同的位置:全局配置文件(如 settings.xml)和项目的 <profile> 元素中。这两种方式定义的仓库有以下区别:

  1. 全局配置文件中的 <repositories>
    • 定义在全局配置文件中的 <repositories> 元素将对所有的Maven项目生效。
    • 这意味着无论你构建哪个项目,都会使用全局配置文件中定义的远程仓库。
    • 全局配置文件通常位于Maven安装目录下的conf目录中。
  2. 项目中的 <profile> 中的 <repositories>
    • 在项目的POM文件中,你可以定义多个 <profile> 元素,并在其中定义 <repositories> 元素。
    • 每个 <profile> 元素可以包含独立的 <repositories> 配置,以满足特定的需求。
    • <profile> 元素可以根据预定义的条件激活,例如根据操作系统、环境变量、命令行参数等。
    • 通过在构建命令中指定激活的 <profile>,可以选择性地应用特定的 <repositories> 配置。

简而言之,全局配置文件中的 <repositories> 对所有项目生效,而项目中的 <profile> 中的 <repositories> 可以根据需要进行选择性应用。全局配置文件适用于希望在所有项目中使用相同的远程仓库配置,而 <profile> 则适用于需要根据特定条件使用不同的仓库配置。

② mirrors(镜像)和 repositories(仓库)是如何进行关联的

在Maven中,<mirrors>(镜像)和 <repositories>(仓库)是通过配置文件(如 settings.xml)进行关联的。

<mirrors> 元素用于定义镜像仓库,而 <repositories> 元素用于定义远程仓库。镜像仓库是指一个代理远程仓库的服务器,可以提供更快的下载速度或者本地缓存。

以下是镜像和仓库之间的关联方式:

  1. <mirrors> 中的 <mirror> 元素:
    • <mirrors> 元素下,可以使用多个 <mirror> 元素来定义不同的镜像仓库。
    • 每个 <mirror> 元素包含 <id><url><mirrorOf> 子元素。
    • <id> 是镜像仓库的唯一标识符。
    • <url> 指定了镜像仓库的地址。
    • <mirrorOf> 指定了该镜像仓库要代理的原始远程仓库的标识符。
  2. <repositories> 中的 <repository> 元素:
    • <repositories> 元素下,可以使用多个 <repository> 元素来定义不同的远程仓库。
    • 每个 <repository> 元素包含 <id><url> 和其他可选子元素。
    • <id> 是仓库的唯一标识符。
    • <url> 指定了远程仓库的地址。

关联的过程如下:

  • 当Maven需要下载一个依赖或插件时,首先会检查 <mirrors> 中是否有匹配该依赖或插件的镜像仓库。
  • 如果找到匹配的镜像仓库,Maven将使用该镜像仓库的 <url> 作为下载地址,并忽略原始远程仓库的地址。
  • 如果没有匹配的镜像仓库或者镜像仓库中没有所需的依赖或插件,Maven将继续检查 <repositories> 中定义的远程仓库,并按照顺序尝试下载。

总之,<mirrors> 元素用于定义镜像仓库,通过匹配 <mirrorOf> 标识符与 <repositories> 中的 <repository> 进行关联。当使用镜像仓库时,Maven将使用镜像仓库的地址下载依赖或插件;如果没有匹配的镜像仓库,将使用 <repositories> 中定义的远程仓库的地址。

③maven 在pom.xml和settings.xml的配置信息

Maven 的 settings.xml 和项目的 pom.xml 是两个不同的配置文件,它们具有不同的作用和范围

settings.xml用于配置 Maven 的全局设置,如镜像仓库、代理服务器、全局属性等。这些全局配置对所有使用该 Maven 安装的项目都有效,并且在多个项目之间共享,相反,pom.xml 文件是项目特定的配置文件,位于项目根目录下,用于定义项目的依赖、构建配置和其他相关信息。pom.xml 文件中的配置是针对该特定项目的,并不会影响其他项目。

虽然有些全局配置可以在 pom.xml 中进行重定义,但并不是所有的全局配置都可以在 pom.xml 中进行替代。例如,settings.xml 中的代理服务器、镜像仓库等全局设置通常不能直接在 pom.xml 中进行配置。

④dependencyManagement无法进行依赖导入问题

通过dependency标签下载依赖,在假如到dependencyManagement中即可解决,原因是dependencyManagement无法自动下载声明的需要引入的依赖

相关推荐
daqinzl2 分钟前
java获取机器ip、mac
java·mac·ip
激流丶18 分钟前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue21 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式38 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画44 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人2 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea