在项目的 pom.xml
中不进行任何配置,仍然不影响 Maven 构建的运行,是因为所有的 pom 文件都会继承一个默认的配置,这个配置称为 超级pom
,在自己项目中的配置会覆盖 超级pom
中的配置,未被覆盖的就会继续使用 超级pom
中的配置
超级pom
定义在 maven-model-builder.jar
中,如果想查看其定义,需要将 jar 包解压,解压后 超级pom
的完整路径为: maven 安装目录\lib\maven-model-builder-3.6.3.jar\org\apache\maven\model\pom-4.0.0.xml
,内容如下:
<project>
<modelVersion>4.0.0modelVersion>
<repositories>
<repository>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
<layout>defaultlayout>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
<layout>defaultlayout>
<snapshots>
<enabled>falseenabled>
snapshots>
<releases>
<updatePolicy>neverupdatePolicy>
releases>
pluginRepository>
pluginRepositories>
<build>
<directory>${project.basedir}/targetdirectory>
<outputDirectory>${project.build.directory}/classesoutputDirectory>
<finalName>${project.artifactId}-${project.version}finalName>
<testOutputDirectory>${project.build.directory}/test-classestestOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/javasourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scriptsscriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/javatestSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resourcesdirectory>
resource>
resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resourcesdirectory>
testResource>
testResources>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<version>1.3version>
plugin>
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<version>2.2-beta-5version>
plugin>
<plugin>
<artifactId>maven-dependency-pluginartifactId>
<version>2.8version>
plugin>
<plugin>
<artifactId>maven-release-pluginartifactId>
<version>2.5.3version>
plugin>
plugins>
pluginManagement>
build>
<reporting>
<outputDirectory>${project.build.directory}/siteoutputDirectory>
reporting>
<profiles>
<profile>
<id>release-profileid>
<activation>
<property>
<name>performReleasename>
<value>truevalue>
property>
activation>
<build>
<plugins>
<plugin>
<inherited>trueinherited>
<artifactId>maven-source-pluginartifactId>
<executions>
<execution>
<id>attach-sourcesid>
<goals>
<goal>jar-no-forkgoal>
goals>
execution>
executions>
plugin>
<plugin>
<inherited>trueinherited>
<artifactId>maven-javadoc-pluginartifactId>
<executions>
<execution>
<id>attach-javadocsid>
<goals>
<goal>jargoal>
goals>
execution>
executions>
plugin>
<plugin>
<inherited>trueinherited>
<artifactId>maven-deploy-pluginartifactId>
<configuration>
<updateReleaseInfo>trueupdateReleaseInfo>
configuration>
plugin>
plugins>
build>
profile>
profiles>
project>
真实的项目中,想一眼看懂当前 Maven 工程都使用了什么配置是很困难的,因为一个 Maven 工程最终的 Pom 配置会受到:父工程 pom,当前工程 pom,超级pom,默认生命周期插件、甚至 setttings.xml 文件中 profiles 的影响
最终有效pom:上述会影响 pom 的因素合并后,所形成的可以被 Maven 构建时真正使用的最终配置
能够影响 pom 的因素这么多,如果我们手动挨个比较来确定最终有效的pom 肯定是不可取的,太离谱,我们可以借助 Maven 插件来自动计算,在有 pom.xml
的路径下使用 maven-help-plugin
插件的 effective-pom
目标就可以
演示
项目的 pom.xml 中,除了 groupId、artifactId、version 之外,没有其他任何配置,运行 mvn help:effective-pom
后效果如下(从结果来分析,最终有效pom的结构为:超级pom的配置 + 默认生命周期插件的配置,这也正可以解释,为何超级pom 中没有默认生命周期插件的配置,而 Maven 却能运行构建功能,因为在最终的有效Pom中,生命周期插件的配置已经被添加):
Effective POMs, after inheritance, interpolation, and profiles are applied:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.ares5kgroupId>
<artifactId>ares5k-pomartifactId>
<version>1.0-SNAPSHOTversion>
<repositories>
<repository>
<snapshots>
<enabled>falseenabled>
snapshots>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>neverupdatePolicy>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
pluginRepository>
pluginRepositories>
<build>
<sourceDirectory>G:\ares5k-pom\src\main\javasourceDirectory>
<scriptSourceDirectory>G:\ares5k-pom\src\main\scriptsscriptSourceDirectory>
<testSourceDirectory>G:\ares5k-pom\src\test\javatestSourceDirectory>
<outputDirectory>G:\ares5k-pom\target\classesoutputDirectory>
<testOutputDirectory>G:\ares5k-pom\target\test-classestestOutputDirectory>
<resources>
<resource>
<directory>G:\ares5k-pom\src\main\resourcesdirectory>
resource>
resources>
<testResources>
<testResource>
<directory>G:\ares5k-pom\src\test\resourcesdirectory>
testResource>
testResources>
<directory>G:\ares5k-pom\targetdirectory>
<finalName>ares5k-pom-1.0-SNAPSHOTfinalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<version>1.3version>
plugin>
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<version>2.2-beta-5version>
plugin>
<plugin>
<artifactId>maven-dependency-pluginartifactId>
<version>2.8version>
plugin>
<plugin>
<artifactId>maven-release-pluginartifactId>
<version>2.5.3version>
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-pluginartifactId>
<version>2.5version>
<executions>
<execution>
<id>default-cleanid>
<phase>cleanphase>
<goals>
<goal>cleangoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-resources-pluginartifactId>
<version>2.6version>
<executions>
<execution>
<id>default-testResourcesid>
<phase>process-test-resourcesphase>
<goals>
<goal>testResourcesgoal>
goals>
execution>
<execution>
<id>default-resourcesid>
<phase>process-resourcesphase>
<goals>
<goal>resourcesgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-jar-pluginartifactId>
<version>2.4version>
<executions>
<execution>
<id>default-jarid>
<phase>packagephase>
<goals>
<goal>jargoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<executions>
<execution>
<id>default-compileid>
<phase>compilephase>
<goals>
<goal>compilegoal>
goals>
execution>
<execution>
<id>default-testCompileid>
<phase>test-compilephase>
<goals>
<goal>testCompilegoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.12.4version>
<executions>
<execution>
<id>default-testid>
<phase>testphase>
<goals>
<goal>testgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-install-pluginartifactId>
<version>2.4version>
<executions>
<execution>
<id>default-installid>
<phase>installphase>
<goals>
<goal>installgoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-deploy-pluginartifactId>
<version>2.7version>
<executions>
<execution>
<id>default-deployid>
<phase>deployphase>
<goals>
<goal>deploygoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-site-pluginartifactId>
<version>3.3version>
<executions>
<execution>
<id>default-siteid>
<phase>sitephase>
<goals>
<goal>sitegoal>
goals>
<configuration>
<outputDirectory>G:\ares5k-pom\target\siteoutputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
execution>
<execution>
<id>default-deployid>
<phase>site-deployphase>
<goals>
<goal>deploygoal>
goals>
<configuration>
<outputDirectory>G:\ares5k-pom\target\siteoutputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
execution>
executions>
<configuration>
<outputDirectory>G:\ares5k-pom\target\siteoutputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-project-info-reports-pluginartifactId>
reportPlugin>
reportPlugins>
configuration>
plugin>
plugins>
build>
<reporting>
<outputDirectory>G:\ares5k-pom\target\siteoutputDirectory>
reporting>
project>
没啥好说的,就是声明当前工程的坐标,用来在 Maven 中进行唯一定位的,简称 gav
<groupId>com.ares5kgroupId>
<artifactId>ares5k-pomartifactId>
<version>1.0-SNAPSHOTversion>
Maven 在执行生命周期 package
阶段时,会根据打包方式,在最终有效pom 里添加合适的默认插件,Maven 的打包方式有很多,列举几个我常用的:
war:项目最终需要放到外置 servlet web 容器运行的场景适合使用,Maven 会将 maven-war-plugin
插件添加到最终有效pom 中当作 package
阶段的默认生命周期插件,执行 package
阶段的构建后会生成一个 war 文件
jar:想通过 java -jar 直接运行项目的场景适合使用,会将 maven-jar-plugin
插件添加到最终有效pom中当作 package
阶段的默认生命周期插件,执行 package
阶段的构建后会生成一个 jar 文件
pom:作为父工程或聚合工程的场景适合使用,主要目的是定义工程结构,执行后,不会生成 jar 或 war 文件
maven-plugin:自定义生命周期插件的场景适合使用,Maven 会将 maven-jar-plugin
和 maven-plugin-plugin
插件添加到最终有效pom 中当作 package
阶段的默认生命周期插件,执行 package
阶段的构建后会生成一个 jar 文件
<packaging>jarpackaging>
子模块中使用,不写
时会从本地或远程仓库中通过 GAV
来定位父工程,写
时会先从
中指定的相对路径中寻找父工程,找不到再从本地或远程仓库查找
<parent>
<groupId>com.ares5kgroupId>
<artifactId>ares5k-pom-parentartifactId>
<version>1.0-SNAPSHOTversion>
<relativePath>../ares5k-pom-parentrelativePath>
parent>
聚合工程中使用,将子模块声明在
后,在聚合工程中执行 Maven 生命周期命令时,所有子模块的相同生命周期命令也都会被执行,有两点要注意:
pom
中的值是子模块工程的相对路径,而不是子模块的
<modules>
<module>../ares5k-module-testmodule>
<module>ares5k-module-innermodule>
modules>
定义下载依赖时的远程仓库,Maven 默认有一个中央仓库
,我们也可以自己添加新的远程仓库,当定义多个远程仓库后,下载依赖时会按照仓库的定义顺序依次去查找下载,直到找到依赖为止,如果所有自定义仓库都未找到所需依赖,那么最后会去 Maven 默认的中央仓库查找
下面是 Maven 默认中央仓库的定义,我们可以仿照这个结构,添加自己的
,远程仓库内部又会分为发布库和快照库,下面代码中
和
就用来指定是去发布库下载还是快照库下载
<repositories>
<repository>
<snapshots>
<enabled>falseenabled>
snapshots>
<releases>
<enabled>trueenabled>
releases>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
repository>
repositories>
Maven 下载插件类型依赖时的远程仓库,也就是在
中声明的依赖。用法和前面的
大同小异,其默认的插件远程仓库结构如下,想使用自己的插件远程仓库时,添加
即可:
<pluginRepositories>
<pluginRepository>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo.maven.apache.org/maven2url>
pluginRepository>
pluginRepositories>
定义在
中的依赖会被下载到本地仓库并被工程引用,想添加新的依赖就追加
节点,然后在节点中指定待引入依赖的工程坐标,既 gav
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
dependencies>
常在父工程和子模块搭配时使用,在父工程的
中定义版本,在子模块的
真正引用。在同一工程中也可以同时使用
和
,但是没有意义
上面说的
的节点路径是: project->dependencies->dependency
,而不是 project->dependencyManagement->dependencies->dependency
在
声明依赖后,其不会触发下载和引用,只有在 project->dependencies->dependency
中真正引用后,才会触发下载和引用,并且此时可以省略版本信息
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
dependencies>
一般搭建私服时常用,执行 Maven 生命周期 deploy
阶段后,会将 package
阶段打好的包,发送到私服
私服就是自己搭建的远程仓库,一般用 nexus
做私服的比较多,远程仓库中又细分发布库和快照库,分别与
和
对应
<distributionManagement>
<repository>
<id>ares5k-releaseid>
<url>http://xxx.xxx.xxx.xxx:xxxx/repository/release/url>
repository>
<snapshotRepository>
<id>ares5k-snapshotid>
<url>http://xxx.xxx.xxx.xxx:xxxx/repository/snapshot/url>
snapshotRepository>
distributionManagement>
在
节点内,主要是项目构建相关的配置,大部分场合就是引入和配置一些生命周期插件
主要是针对源代码路径、资源文件路径、编译后输出路径、打包后路径、打包名称等进行设置,这些都是 Maven 默认生命周期插件执行时所需要的信息
节点名 | 描述 |
---|---|
sourceDirectory | Java 源代码路径 |
testSourceDirectory | 测试用的 Java 源代码路径 |
outputDirectory | Java 源代码编译后的二进制文件存放路径 |
testOutputDirectory | 测试用的 Java 源代码编译后的二进制文件存放路径 |
resources | 资源文件路径 |
testResources | 测试用的资源文件路径 |
directory | 打包后,包的存放路径 |
finalName | 打包的包名 |
示例如下,注意路径中的正反斜杠:
<build>
<sourceDirectory>G:/ares5k-pom/src/main/javasourceDirectory>
<testSourceDirectory>G:/ares5k-pom/src/test/javatestSourceDirectory>
<outputDirectory>G:/ares5k-pom/target/classesoutputDirectory>
<testOutputDirectory>G:/ares5k-pom/target/test-classestestOutputDirectory>
<resources>
<resource>
<directory>G:/ares5k-pom/src/main/resourcesdirectory>
resource>
resources>
<testResources>
<testResource>
<directory>G:/ares5k-pom/src/test/resourcesdirectory>
testResource>
testResources>
<directory>G:/ares5k-pom/targetdirectory>
<finalName>ares5k-pom-3-1.0-SNAPSHOTfinalName>
build>
通过追加
节点来新增插件,
部分是用来将插件与生命周期进行绑定的,如果是 Maven 的默认生命周期插件还好,如果是自己引入的非 Maven 默认生命周期插件,不设置
的话,就无法将插件和生命周期绑定,也就不能通过生命周期构建命令直接运行插件,只能通过运行插件的方式来运行插件,
用来绑定生命周期阶段,
用来指定该阶段执行的插件目标
上述部分不太理解的,可以看我关于 maven 自定义插件的文章,相信会有更好的理解
部分是设置插件的属性,每个插件都有自己的属性,所以这个地方无法展开来讲
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.3.7.RELEASEversion>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
<phase>packagephase>
execution>
executions>
<configuration>
<mainClass>com.ares5k.AppmainClass>
configuration>
plugin>
plugins>
build>
一般定义在父工程中,网上很多文章都说
和
一样,声明插件后不会真正的引入,必须要子模块的 project->plugins->plugin
主动声明时才能真正的引入,我不知道他们测没测过,我在 maven 3.6.3
中测试过程是这样的:
pluginManagement
中声明一个插件projecet->plugins->plugin
中不主动引入pom.xml
目录运行构建命令结果:依然使用了父工程 pluginManagement
中声明的插件,这个结果和网上说的完全不同,反正我自己是相信测试结果,所以 pluginManagement
在我看来并不是与 dependencyManagement
一样用来管理版本,而是统一管理插件
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>3.1.2version>
plugin>
plugins>
pluginManagement>
当项目需要满足多环境配置时,比如开发环境、测试环境、商用环境、甚至是 Java 8 环境 和 Java 17 环境,每个环境的 pom.xml
配置肯定都有不一样的地方,如果准备很多份 pom.xml
文件,然后以文件替换的方式来实现环境切换就很麻烦
上述场景就可以使用备用配置的方式,将各个环境间相同的配置像以前一样写在 pom.xml
中,然后将各环境间不同的地方,定义在
中作为备用配置,当使用 Maven 执行构建时,在命令中指定想应用的备用配置,让其加入最终有效pom中,实现环境切换的效果
在
节点中可以包函
、
、
、
、
、
、
等信息,但是不能包函 gav
、
、
这种工程信息
来个示例
假设项目有两个运行环境,其要求如下:
spring-boot-starter
模块spring-boot-maven-plugin
插件来实现打包lombok
模块上面这种情况就是很典型的备用配置适用场景,我们可以这样实现环境切换:
spring-boot-starter
模块是两个环境都需要的,就正常在 pom.xml
中引入就可以
配置如下,每个
都必须要有自己的唯一
:
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.4.1version>
dependency>
dependencies>
<profiles>
<profile>
<id>ares5k-Aid>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>2.3.7.RELEASEversion>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
<phase>packagephase>
execution>
executions>
<configuration>
<mainClass>com.ares5k.AppmainClass>
configuration>
plugin>
plugins>
build>
profile>
<profile>
<id>ares5k-Bid>
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.24version>
dependency>
dependencies>
profile>
profiles>
现在 pom.xml
已经配置完成,之后构建时通过语法 mvn 生命周期阶段 -P
就可以实现环境切换了
以上面配置为例,用环境A的备用配置打包,命令为 mvn package -Pares5k-A
假设经常使用环境A的配置进行打包,那么每次输入命令都需要指定
就显得很麻烦,我们也可以在
节点下添加激活条件:
<profile>
<id>ares5k-Aid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<build>
<plugins>
.......
profile>
添加了上面的配置后,环境A 的备用配置就变成了默认激活,以后再想用 环境A 的配置构建项目时,直接输入mvn package
就可以,不需要指定
了。
下的激活方式有很多,
则是默认激活的意思,其他的激活方式有:
<activeByDefault>falseactiveByDefault>
<jdk>1.8jdk>
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
os>
<property>
<name>ares5k-propname>
<value>6666value>
property>
<file>
<exists>env.propertiesexists>
file>
<file>
<missing>env.propertiesmissing>
file>
当指定了多个激活条件时,Maven 3.2.2
之前只要满足一个条件,备用配置就会被激活,Maven 3.2.2
开始,必须所有条件都满足,备用配置才会被激活
Maven 核心配置文件位置:Maven 安装目录/conf/settings.xml
,这是全局级别的配置文件,如果将其复制到用户目录内(以 Windows 为例, C:\Users\{用户文件夹}\.m2
) 中,那么它的级别会变成用户级,当两个文件都存在,用户目录内的优先级更高
这个文件没啥太多说的,因为节点很少,而且原始的文件中,对每一个节点都有详细的注释说明,我这里就对几个常用的聊一聊
Maven 从远程仓库下载依赖后,会将依赖放到本地仓库中,等未来在需要时就直接用本地仓库中的依赖,默认的本地仓库路径在用户目录内(以 Windows 为例 C:\Users\{用户文件夹}\.m2\repository
), 可以通过
修改本地仓库路径,修改后再次下载的依赖会存放在新的路径内,查找本地仓库时也会在新的路径内查找
<localRepository>E:\maven\repositorylocalRepository>
想在项目中使用自定义 Maven 插件时使用,
中指定自定义插件的
即可
<pluginGroups>
<pluginGroup>com.ares5kpluginGroup>
pluginGroups>
通过
指定要拦截的远程仓库ID,当 Maven 对远程仓库发起请求时,会将目标地址替换成
<mirrors>
<mirror>
<id>aliyunid>
<name>aliyunname>
<mirrorOf>centralmirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
mirrors>
当仓库需要授权访问时,我们必须通过
设置访问时的账号密码,否则无法下载或上传模块,server->id
的值不能乱写,必须在下面几个中选择:
<servers>
<server>
<id>ares5k-nexusid>
<username>ares5kusername>
<password>123456password>
server>
servers>
<mirrors>
<mirror>
<id>ares5k-nexusid>
<name>aliyunname>
<mirrorOf>centralmirrorOf>
<url>http://xxx.xxx.x.xx:xxxx/ares5k/publicurl>
mirror>
mirrors>
和前面 pom.xml
中的
一样,只不过 settings.xml
中的是全局级别,pom.xml
中的是项目级别
在前面讲的 pom.xml
中定义
的知识点中,介绍了两种启用备份配置的方式:
-P
指定激活的备份配置
节点下通过添加
节点来激活备份配置在 settings.xml
中多了一种方式来激活备份配置,就是利用
节点,在
的子节点
中指定
就可以激活对应的备份配置
<profiles>
<profile>
<id>ares5kid>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
profile>
<profiles>
<activeProfiles>
<activeProfile>ares5kactiveProfile>
activeProfiles>
当网络访问不顺畅或无法访问外部网络时,可以设置访问代理服务器,由代理服务器真正发起网络请求
说实话我没用过这个功能,因为我一直用的国内镜像仓库, 网络访问一直顺畅,还没有机会使用这个功能,我把原始配置文件中这部分的注释粘过来了,感觉没啥东西,实际使用时对照注释中的例子简单改改就行
<proxies>
proxies>