xml 小知识
1 2 3 4 5 6 7 8 9 10
| <settings <!-- xml 名字空间 --> 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.xml 的功能
settings.xml 是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。
Settings.xml中包含:
settings.xml文件位置
settings.xml文件一般存在于两个位置:
全局配置(通常被我们忽略的更全局的配置): ${M2_HOME}/conf/settings.xml
用户配置(通常被我们使用的配置): ${user.home}/.m2/settings.xml
note:用户配置优先于全局配置。${user.home} 和和所有其他系统属性只能在3.0+版本上使用。请注意windows和Linux使用变量的区别。
配置优先级
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
顶级元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <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>
|
LocalRepository
作用:该值表示构建系统本地仓库的路径。
其默认值:~/.m2/repository
。
1
| <localRepository>${user.home}/.m2/repository</localRepository>
|
InteractiveMode
作用:表示maven是否需要和用户交互以获得输入。
如果maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。
1
| <interactiveMode>true</interactiveMode>
|
UsePluginRegistry
作用:maven是否需要使用plugin-registry.xml文件来管理插件版本。
如果需要让maven使用文件~/.m2/plugin-registry.xml
来管理插件版本,则设为true。默认为false。
1
| <usePluginRegistry>false</usePluginRegistry>
|
Offline
作用:表示maven是否需要在离线模式下运行。
如果构建系统需要在离线模式下运行,则为true,默认为false。
当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。
1
| <offline>false</offline>
|
PluginGroups
作用:当插件的组织id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。
该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。
当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins和org.codehaus.mojo。
1 2 3 4 5 6 7 8 9 10
| <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"> ... <pluginGroups> <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> ... </settings>
|
Servers
作用:一般,仓库的下载和部署是在pom.xml文件中的 repositories 和 distributionManagement 元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在settings.xml中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <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"> ... <servers> <server> <id>server001</id> <username>my_login</username> <password>my_password</password> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <passphrase>some_passphrase</passphrase> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> </server> </servers> ... </settings>
|
向 server 部署的命令
1
| mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=全路径.jar -DgroupId=替换你自己的 -DartifactId=替换你自己的 -Dversion=0.1 -Dpackaging=jar -DrepositoryId=仓库 -Durl=https://xxx.com/nexus3/repository/maven-release/
|
这里的 repositoryId 是上面的 server001
Mirrors
作用:为仓库列表配置的下载镜像列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <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"> ... <mirrors> <mirror> <id>planetmirror.com</id> <name>PlanetMirror Australia</name> <url>http://downloads.planetmirror.com/pub/maven2</url> <mirrorOf>central</mirrorOf> <blocked>false</blocked> </mirror> </mirrors> ... </settings>
|
两个例子。现在的主流仓库都是https了,如果使用http可能遇到 301 报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>https://maven.aliyun.com/nexus/content/groups/public</url> </mirror> </mirrors>
<mirrors> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>maven repo1</name> <url>https://repo1.maven.org/maven2/</url> </mirror> </mirrors>
|
Proxies
作用:用来配置不同的代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| <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"> ... <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|192.168.58.*|10.*|mirrors.xxx.com</nonProxyHosts> <sslHostConfig> <all>true</all> <sslProtocol>all</sslProtocol> <sslEnabled>true</sslEnabled> <sslProtocols>TLSv1.2</sslProtocols> <ignoreCertificates>true</ignoreCertificates> <trustSelfSigned>true</trustSelfSigned> <allowAllCerts>true</allowAllCerts> </sslHostConfig> </proxy> </proxies> ... </settings>
|
Profiles
作用:根据环境参数来调整构建配置的列表。
settings.xml中的profile元素是pom.xml中profile元素的裁剪版本。
它包含了id、activation、repositories、pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为这里只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <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"> ... <profiles> <profile> <id>test</id> <activation /> <properties /> <repositories /> <pluginRepositories /> </profile> </profiles> ... </settings>
|
快照与发布
我们考虑这种问题要分清楚:
- 我们是使用者还是开发者?这决定了我们使用 repository/pluginRepository,还是 distributionManagement。
- 我们如果是使用者,我们要分清我们是使用第一方还是第三方,然后我们要分清我们要使用快照还是发布。
- 当我们选择快照和发布的时候,我们还要分清 updatePolicy。
对于 Maven 来说,snapshot 和 release 仓库的设置有以下区别:
- 仓库的用途不同:
- snapshot 仓库用于存储开发过程中的不稳定版本,这些版本的构件可能会频繁更新。
- release 仓库用于存储稳定的发布版本,这些版本的构件不会再进行修改。
- 版本号的约定不同:
- snapshot 版本的版本号以 “-SNAPSHOT” 结尾,如 “1.0-SNAPSHOT”。
- release 版本的版本号不包含 “-SNAPSHOT” 后缀,如 “1.0”。
- 更新策略不同:
- 对于 snapshot 版本,Maven 每次构建时都会自动检查远程仓库是否有更新,并下载最新的构件。
- 对于 release 版本,Maven 默认不会检查更新,而是直接使用本地仓库中的构件。
- 部署策略不同:
- snapshot 版本通常会频繁部署到 snapshot 仓库中,以供其他开发者使用。
- release 版本通常只会在稳定后部署一次到 release 仓库中,不再进行修改。
这种 snapshot 和 release 的区分确实是一种约定高于配置的设计。Maven 通过版本号的约定来区分构件的稳定性,并根据约定自动选择适当的仓库和更新策略。这种约定简化了配置,提高了构建的可重复性和可靠性。
其他构建工具也有类似的约定:
- Gradle 使用 “-SNAPSHOT” 后缀来标识 snapshot 版本,并支持配置不同的 snapshot 和 release 仓库。
- Ivy 使用 “latest.integration” 和 “latest.release” 来区分 snapshot 和 release 版本,并支持配置不同的仓库。
- sbt (Scala 构建工具)使用 “-SNAPSHOT” 后缀来标识 snapshot 版本,并支持配置不同的 snapshot 和 release 仓库。
总的来说,snapshot 和 release 的区分是构建工具中的一种常见约定,用于管理构件的稳定性和发布流程。这种约定简化了配置,提高了构建的可重复性和可靠性,是构建工具设计中的一种最佳实践。
一个完整的远程仓库,需要配置至少如下四类 repo 来管理 jar:
- release
- snapshot
- thirdParty-release
- thirdParty-snapshot
其中
- 标准的用法里,首先从仓库名称标识出仓库的性质,然后使用属性进一步区分快照和发布:
- 对于 release 仓库:releases enabled 为 true,snapshots enabled 为 false;
- 对于 snapshot 仓库:releases enabled 为 false,snapshots enabled 为 true。
- 对于 maven central 或者它的镜像,选项都是 true。
- 后两者其实并不是特别的类型,而是在 id 的名字上有所区别。如设计
<id>thirdparty</id>
或者<id>thirdparty-snapshots</id>
的<repository>
。这也就意味着还可以有二方的仓库和四方的仓库,只要你能够从 id 里区分开这些仓库。
这四种仓库在 Maven 中有不同的用途和约定:
- release 仓库:
- 用于存储和管理项目自己的稳定发布版本的构件。
- 这些构件的版本号不包含 “-SNAPSHOT” 后缀,表示它们是经过测试和验证的稳定版本。
- 项目在发布新的稳定版本时,会将构件部署到 release 仓库。
- 其他项目或者最终用户可以从 release 仓库获取这些稳定的发布版本。
- snapshot 仓库:
- 用于存储和管理项目自己的开发版本的构件。
- 这些构件的版本号以 “-SNAPSHOT” 结尾,表示它们是不稳定的开发版本。
- 项目在开发过程中,会频繁地将构件部署到 snapshot 仓库,以供其他开发者或者自动化测试使用。
- 其他项目如果依赖了 snapshot 构件,每次构建时都会自动获取 snapshot 仓库中的最新版本。
- thirdParty-release 仓库:
- 用于存储和管理第三方的稳定发布版本的构件。
- 这些构件通常是项目依赖的外部库或者框架的稳定版本。
- 将第三方的 release 构件单独存储在 thirdParty-release 仓库中,可以与项目自己的 release 构件分开管理。
- 项目在构建时,会优先从 thirdParty-release 仓库获取所依赖的第三方构件的稳定版本。
- thirdParty-snapshot 仓库:
- 用于存储和管理第三方的开发版本的构件。
- 这些构件通常是项目依赖的外部库或者框架的不稳定版本,例如一些尚未发布正式版本的新特性或者修复。
- 将第三方的 snapshot 构件单独存储在 thirdParty-snapshot 仓库中,可以与项目自己的 snapshot 构件分开管理。
- 项目在开发过程中,如果需要使用第三方的最新开发版本,可以从 thirdParty-snapshot 仓库获取。
通过将构件按照稳定性和来源进行分类存储,Maven 可以更好地管理项目的依赖关系和构建过程:
项目自己的稳定版本和开发版本分别存储在 release 和 snapshot 仓库中,便于版本控制和发布管理。
第三方的稳定版本和开发版本分别存储在 thirdParty-release 和 thirdParty-snapshot 仓库中,与项目自己的构件分开管理,避免混淆。
这种分类存储的方式是 Maven 的一种最佳实践,可以提高构建的可靠性和可维护性。具体的仓库命名和划分方式可以根据项目的实际情况进行调整。
两个具体的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <repositories> <repository> <id>some-company-releases</id> <name>Repository for releases artifacts</name> <url>http://pixel.some-company.com/repository/group-releases</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </releases> </repository> <repository> <id>some-company-snapshots</id> <name>Repository for snapshots artifacts</name> <url>http://pixel.some-company.com/repository/group-snapshots</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> </snapshots> <releases> <enabled>false</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>some-company-releases-plugin</id> <name>Repository for plugin releases artifacts</name> <url>http://pixel.some-company.com/repository/group-releases</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </releases> </pluginRepository> <pluginRepository> <id>some-company-snapshots-plugin</id> <name>Repository for plugin snapshots artifacts</name> <url>http://pixel.some-company.com/repository/group-snapshots</url> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>ignore</checksumPolicy> </snapshots> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories>
|
Activation
作用:自动触发profile的条件逻辑。
如pom.xml中的profile一样,profile的作用在于它能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。
activation元素并不是激活profile的唯一方式。settings.xml文件中的activeProfile元素可以包含profile的id。profile也可以通过在命令行,使用-P标记和逗号分隔的列表来显式的激活(如,-P test)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <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> 注:在maven工程的pom.xml所在目录下执行mvn help:active-profiles命令可以查看中央仓储的profile是否在工程中生效。
|
properties
作用:对应profile的扩展属性列表。
maven属性和ant中的属性一样,可以用来存放一些值。这些值可以在pom.xml中的任何地方使用标记${X}来使用,这里X是指属性的名称。属性有五种不同的形式,并且都能在settings.xml文件中访问。
1 2 3 4 5 6 7 8 9 10
|
<properties> <user.install>${user.home}/our-project</user.install> </properties>
|
注:如果该profile被激活,则可以在pom.xml中使用${user.install}。
Repositories
作用:远程仓库列表,它是maven用来填充构建系统本地仓库所使用的一组远程仓库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <repositories> <repository> <id>codehausSnapshots</id> <name>Codehaus Snapshots</name> <releases> <enabled>false</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <url>http://snapshots.maven.codehaus.org/maven2</url> <layout>default</layout> </repository> </repositories>
|
pluginRepositories
作用:发现插件的远程仓库列表。
和repository类似,只是repository是管理jar包依赖的仓库,pluginRepositories则是管理插件的仓库。
maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。pluginRepositories元素的结构和repositories元素的结构类似。每个pluginRepository元素指定一个Maven可以用来寻找新插件的远程地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <pluginRepositories> <pluginRepository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </pluginRepository> </pluginRepositories>
|
ActiveProfiles
作用:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。
该元素包含了一组activeProfile元素,每个activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生。
例如,env-test是一个activeProfile,则在pom.xml(或者profile.xml)中对应id的profile会被激活。如果运行过程中找不到这样一个profile,Maven则会像往常一样运行。
1 2 3 4 5 6 7 8 9 10
| <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"> ... <activeProfiles> <activeProfile>env-test</activeProfile> </activeProfiles> ... </settings>
|
参考:
- 《Maven 全局配置文件settings.xml详解》
- 《xsi:schemaLocation有何作用》