maven settings.xml配置详解
settings.xml文件位置
settings.xml文件一般存在于两个位置:
全局配置: ${M2_HOME}/conf/settings.xml
用户配置: user.home/.m2/settings.xml
配置优先级
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
settings.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"> <!-- 默认值是${user.home}/.m2/repository --> <localRepository>E:/project/localRepository</localRepository> <!-- 表示是否使用交互模式,默认是true 如果为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是因为这两个都有默认值。 --> <interactiveMode>true</interactiveMode> <!-- 如果Maven使用${user.home}/.m2/plugin-registry.xml来管理plugin的版本,就设置为true,默认为false --> <usePluginRegistry>false</usePluginRegistry> <!-- 如果构建系统要在离线模式下工作,设置为true,默认为false。如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,那么这个设置是非常有用的。 --> <offline>false</offline> <!--插件组 在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 --> <!--服务器 用来下载和部署的仓库是用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> <!--镜像--> <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> <!-- 代理设置,主要用于无法直接访问中心的库用户配置 --> <!--用来配置不同的代理,多代理profiles 可以应对笔记本或移动设备的工作环境:通过简单的设置profile id就可以很容易的更换整个代理配置。 --> <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> <!--配置文件 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构件。 --> <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> <!--插件仓库(plugin repositories) 仓库包含了两种重要类型的构件:第一种是用来做其他构件依赖的构件,这是在中央仓库中的大多数插件。另外一种类型的构件就是插件。 Maven的插件本身就是一种特殊的构件。因此,插件仓库被从其他仓库中分离出来。 pluginRepositories元素模块的结构与repositories模块很相似。pluginRepository元素指向一个可以找到新插件的远程地址。 --> <pluginRepositories> <pluginRepository> <id>ccl-nexus</id> <url>http://172.16.10.99:8081/nexus/content/groups/public</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <!--属性(properites) Maven的属性是值占位符,就像Ant中的属性。如果X是一个属性的话,那么它的值在POM中可以使用${X}来进行任意地方的访问。他们来自于五种不同的风格,所有都可以从settings.xml文件中访问到。 1.env.X:使用“env.”前缀将会返回当前的环境变量。例如${env.PATH}就是使用了$path环境变量。 2.project.X:一个点“.”分割的路径,在POM中就是相关的元素的值。例如:<project><version>1.0</version></project>就可以通过${project.version}来访问。 3.settings.X:一个点“.”分割的路径,在settings.xml中就是相对应的元素的值,例如:<settings><offline>false</offline></settings>就可以通过${settings.offline}来访问。 4.Java系统属性:所有通过java.lang.System.getProperties()来访问的属性都可以像POM中的属性一样访问,例如:${java.home} 5.X:被<properties/>或者外部文件定义的属性,值可以这样访问${someVar} --> <properties> <sonar.jdbc.url> jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8 </sonar.jdbc.url> <sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName> <sonar.jdbc.username>root</sonar.jdbc.username> <sonar.jdbc.password></sonar.jdbc.password> <sonar.host.url>http://172.16.11.43:80</sonar.host.url> </properties> <!--如果这个profile被激活,那么属性${sonar.jdbc.url}就可以被访问了--> </profile> </profiles> <!--激活配置(Active Profiles)--> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles> </settings>
科普
中央仓库:目前来说,http://repo1.maven.org/maven2/
是真正的Maven
中央仓库的地址,该地址内置在Maven
的源码中,其它地址包括著名的ibiblio.org,都是镜像。
索引:中央仓库带有索引文件以方便用户对其进行搜索,完整的索引文件至2019年1月22日大小约为1.04G,索引每周更新一次。
提交内容:只要你的项目是开源的,而且你能提供完备的POM
等信息,你就可以提交项目文件至中央仓库,这可以通过Sonatype
提供的开源Maven仓库托管服务实现。
IntelliJ IDEA利用索引实现自动补全
众所周知,由于伟大的中国防火墙,所以在使用IDEA
下载Maven
仓库索引的时候,要么无法访问,要么就是速度极慢,这对开发人员带来了极大的不便,所以一般公司都用Nexus
搭建一个公司内部的私服。同时利用私服更有利于对公司内部开发人员依赖的Jar
包版本进行控制。
也许你会问,中央仓库带有索引,为什么本地的IDEA也需要下载索引呢?那么直接看下图你就明白了,如果本地没有下载索引的话,在pom.xml
文件中添加依赖是得不到任何提示的。
下载Maven仓库的索引
在配置完成之后就可以下载仓库索引了,注意这是一个非常耗时的过程,建议利用晚上或者出去午饭时间下载。下载过程及下载完成之后状态如下图所示。