Maven的settings.xml配置详解

Maven的settings.xml配置详解

1 基本介绍

maven的两大配置文件:settings.xml和pom.xml。其中settings.xml是maven的全局配置文件,pom.xml则是文件所在项目的局部配置。

1.1 settings.xml文件位置

①全局配置文件:${M2_HOME}/conf/settings.xml,对操作系统所有者生效

②用户配置:user.home/.m2/settings.xml,只对当前操作系统的使用者生效

1.2 配置文件优先级

局部配置优先于全局配置。

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

如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。如果全局配置和用户配置都存在,它们的内容将被合并,并且用户范围的settings.xml会覆盖全局的settings.xml。

1.3 注意事项

  • note1: Maven安装后,用户目录下不会自动生成settings.xml,只有全局配置文件。如果需要创建用户范围的settings.xml,可以将安装路径下的settings复制到目录${user.home}/.m2/。Maven默认的settings.xml是一个包含了注释和例子的模板,可以快速的修改它来达到你的要求。
  • note2: 全局配置一旦更改,所有的用户都会受到影响,而且如果maven进行升级,所有的配置都会被清除,所以要提前复制和备份${M2_HOME}/conf/settings.xml文件,一般情况下不推荐配置全局的settings.xml。

2 标签详解

2.1 顶级元素概览

<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/>
    
    
  	<usePluginRegistry/>
    
    
  	<offline/>
    
        
  	<pluginGroups/>

    
  	<servers/>
  	<mirrors/>
  	<proxies/>
  	<profiles/>
  	<activeProfiles/>
settings>

2.2 标签servers

作用:一般,仓库的下载和部署是在pom.xml文件中的repositories和distributionManagement元素中定义的。

然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,

这些信息可以配置在settings.xml中。

<servers>
    <server>
        
        <id>serverIdid>
        
        
        <username>usernameusername>
        <password>passwordpassword>
        
        
        <privateKey>${usr.home}/.ssh/id_dsaprivateKey>
        
      	<passphrase>passphrasepassphrase>
        
        
      	<filePermissions>664filePermissions>
      	
      	<directoryPermissions>775directoryPermissions>
    server>
servers>

2.3 标签mirrors

<mirrors>
    <mirror>
        
        <id>mirrorIdid>
        
        
        <name>namename>
        
        
        <url>urlurl>
        
      	
      	<mirrorOf>centralmirrorOf>
    mirror>
mirrors>

2.4 标签profiles

作用:根据环境参数来调整构建配置的列表。

settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。

它包含了id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile

<profiles>
    <profile>
      	<id>testid> 
      	<activation />       
      	<properties />       
      	<repositories />       
      	<pluginRepositories /> 
    profile>
profiles>
2.4.1 activation

作用:自动触发profile的条件逻辑。

如pom.xml中的profile一样,profile的作用在于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。

activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。

<activation>
  	
  	<activeByDefault>falseactiveByDefault>
    
  	
  	<jdk>1.5jdk>
    
  	
  	<os>
    	
    	<name>Windows XPname>
    	
    	<family>Windowsfamily>
    	
    	<arch>x86arch>
    	
    	<version>5.1.2600version>
  	os>
    
  	
  	<property>
    	
    	<name>mavenVersionname>
    	
    	<value>2.0.3value>
  	property>
    
  	
  	<file>
    	
    	<exists>${basedir}/file2.propertiesexists>
    	
    	<missing>${basedir}/file1.propertiesmissing>
  	file>
activation>

注:在maven工程的pom.xml所在目录下执行mvn help:active-profiles命令可以查看中央仓储的profile是否在工程中生效。

2.4.2 properties

作用:对应profile的扩展属性列表。

maven属性和ant中的属性一样,可以用来存放一些值。这些值可以在pom.xml中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。


<properties>
  <user.install>${user.home}/our-projectuser.install>
properties>

注:如果该profile被激活,则可以在pom.xml中使用${user.install}

2.4.3 repositories

作用:远程仓库列表,它是maven用来填充构建系统本地仓库所使用的一组远程仓库。

<repositories>
  	
  	<repository>
    	
    	<id>codehausSnapshotsid>
    	
        <name>Codehaus Snapshotsname>
    	
        
    	<url>http://snapshots.maven.codehaus.org/maven2url>
        
        
    	<releases>
      		
      		<enabled>falseenabled>
      		
      		<updatePolicy>alwaysupdatePolicy>
      		
      		<checksumPolicy>warnchecksumPolicy>
    	releases>
        
    	
    	<snapshots>
      		<enabled />
      		<updatePolicy />
      		<checksumPolicy />
    	snapshots>
    
    	
    	<layout>defaultlayout>
  	repository>
repositories>
2.4.4 pluginRepositories

作用:发现插件的远程仓库列表。

和repository类似,只是repository是管理jar包依赖的仓库,pluginRepositories则是管理插件的仓库。

maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。

<pluginRepositories>
  	
	
  	<pluginRepository>
      	<id />
    	<name />
    	<url />
        
    	<releases>
      		<enabled />
      		<updatePolicy />
      		<checksumPolicy />
    	releases>
      
        <snapshots>
            <enabled />
            <updatePolicy />
            <checksumPolicy />
        snapshots>
    
    	<layout />
  	pluginRepository>
pluginRepositories>

2.5 activeProfiles

作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。

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

<activeProfiles>
    
    <activeProfile>envactiveProfile>
activeProfiles>

3 番外篇:mirror和repository区别

简单点来说,repository就是个仓库。maven里有两种仓库,本地仓库和远程仓库。远程仓库相当于公共的仓库,大家都能看到。本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用。当你向仓库请求插件或依赖的时候,会先检查本地仓库里是否有。如果有则直接返回,否则会向远程仓库请求,并做缓存。你也可以把你做的东西上传到本地仓库给你本地自己用,或上传到远程仓库,供大家使用。 internal repository是指在局域网内部搭建的repository,它跟central repository, jboss repository等的区别仅仅在于其URL是一个内部网址。

远程仓库可以在工程的pom.xml文件里指定。如果没指定,默认就会把下面这地方做远程仓库,即默认会到 http://repo1.maven.org/maven2 这个地方去请求插件和依赖包。

<repository>  
	<snapshots>  
        <enabled>falseenabled>  
    snapshots>  
    <id>centralid>  
    <name>Maven Repository Switchboardname>  
    <url>http://repo1.maven.org/maven2url>  
repository>

镜像是仓库的镜子,保存了被镜像仓库的所有的内容,主要针对远程仓库而言。配置mirror的目的一般是出于网速考虑。如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。举个例子,http://maven.NET.cn/content/groups/public/ 是中央仓库 http://repo1.maven.org/maven2/ 在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。

id的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像。

关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像。这时,可以配置这样的一个镜像,如例:

<settings>
    ...
    <mirrors>
        <mirror>
            <id>internal-repositoryid>
            <name>Internal Repository Managername>
            <url>http://192.168.1.100/maven2url>
            <mirrorOf>*mirrorOf>
        mirror>
    mirrors>
    ...
settings>

该例中的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至http://192.168.1.100/maven2/。

如果该镜像仓库需要认证,则配置一个Id为internal-repository的即可。

为了满足一些复杂的需求,Maven还支持更高级的镜像配置:

  1. *\

    匹配所有远程仓库。

  2. \external:*\

    匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。

  3. \repo1,repo2\

    匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。

  4. *,!repo1\

    匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件

一般远程仓库的镜像配置为阿里云的镜像:

<mirrors>
    <mirror>
        <id>alimavenid>
        <name>aliyun mavenname>
        <url>http://maven.aliyun.com/nexus/content/groups/public/url>
        <mirrorOf>centralmirrorOf>
    mirror>
 mirrors>

你可能感兴趣的:(maven,java,maven,项目管理)