<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 模型版本 --> <modelVersion>4.0.0</modelVersion> <!--父项目的坐标,坐标包括group ID,artifact ID和version。 --> <!--如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值 --> <parent> <!--被继承的父项目的构件标识符 --> <artifactId>com.companyname.project-group</artifactId> <!--被继承的父项目的全球唯一标识符 --> <groupId>base-project</groupId> <!--被继承的父项目的版本 --> <version>1.0.1-RELEASE</version> <!-- 父项目的pom.xml文件的相对路径,默认值是../pom.xml。 --> <!-- 寻找父项目的pom:构建当前项目的地方--)relativePath指定的位置--)本地仓库--)远程仓库 --> <relativePath>../pom.xml</relativePath> </parent> <modules> <module>app-util</module> <module>app-dao</module> <module>app-service</module> <module>app-web</module> </modules> <!-- 公司或者组织的唯一标志,也是打包成jar包路径的依据 --> <!-- 例如com.companyname.project-group,maven打包jar包的路径:/com/companyname/project-group --> <groupId>com.companyname.project-group</groupId> <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --> <artifactId>project</artifactId> <!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 --> <version>1.0</version> <!--项目产生的构件类型,包括jar、war、ear、pom等 --> <packaging>jar</packaging> <!--该元素描述了项目相关的所有依赖。 这些依赖自动从项目定义的仓库中下载 --> <dependencies> <dependency> <!------------------- 依赖坐标 -------------------> <!--依赖项目的坐标三元素:groupId + artifactId + version --> <groupId>org.apache.maven</groupId> <artifactId>maven-artifact</artifactId> <version>3.8.1</version> <!------------------- 依赖类型 -------------------> <!-- 依赖类型,默认是jar。通常表示依赖文件的扩展名,但有例外。一个类型可以被映射成另外一个扩展名或分类器 --> <!-- 类型经常和使用的打包方式对应,尽管这也有例外,一些类型的例子:jar,war,ejb-client和test-jar --> <!-- 如果设置extensions为true,就可以在plugin里定义新的类型 --> <type>jar</type> <!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面 --> <!-- 如果想将项目构建成两个单独的JAR,分别使用Java 4和6编译器,就可以使用分类器来生成两个单独的JAR构件 --> <classifier></classifier> <!------------------- 依赖传递 -------------------> <!--依赖排除,即告诉maven只依赖指定的项目,不依赖该项目的这些依赖。此元素主要用于解决版本冲突问题 --> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> <!-- 可选依赖,用于阻断依赖的传递性。如果在项目B中把C依赖声明为可选,那么依赖B的项目中无法使用C依赖 --> <optional>true</optional> <!------------------- 依赖范围 -------------------> <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来 - compile:默认范围,用于编译; - provided:类似于编译,但支持jdk或者容器提供,类似于classpath - runtime: 在执行时需要使用; - systemPath: 仅用于范围为system。提供相应的路径 - test: 用于test任务时使用; - system: 需要外在提供相应的元素。通过systemPath来取得 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 --> <scope>test</scope> <!-- 该元素为依赖规定了文件系统上的路径。仅供scope设置system时使用。但是不推荐使用这个元素 --> <!-- 不推荐使用绝对路径,如果必须要用,推荐使用属性匹配绝对路径,例如${java.home} --> <systemPath></systemPath> </dependency> </dependencies> <!-- 继承自该项目的所有子项目的默认依赖信息,这部分的依赖信息不会被立即解析。 --> <!-- 当子项目声明一个依赖,如果group ID和artifact ID以外的一些信息没有描述,则使用这里的依赖信息 --> <dependencyManagement> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> </dependencyManagement> <!--构建项目需要的信息 --> <build> <!--------------------- 路径管理(在遵循约定大于配置原则下,不需要配置) ---------------------> <!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --> <sourceDirectory /> <!--该元素设置了项目单元测试使用的源码目录。该路径是相对于pom.xml的相对路径 --> <testSourceDirectory /> <!--被编译过的应用程序class文件存放的目录。 --> <outputDirectory /> <!--被编译过的测试class文件存放的目录。 --> <testOutputDirectory /> <!--项目脚本源码目录,该目录下的内容,会直接被拷贝到输出目录,因为脚本是被解释的,而不是被编译的 --> <scriptSourceDirectory /> <!--------------------- 资源管理 ---------------------> <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 --> <resources> <!--这个元素描述了项目相关或测试相关的所有资源路径 --> <resource> <!-- 描述了资源的目标输出路径。该路径是相对于target/classes的路径 --> <!-- 如果是想要把资源直接放在target/classes下,不需要配置该元素 --> <targetPath /> <!--是否使用参数值代替参数名。参数值取自文件里配置的属性,文件在filters元素里列出。 --> <filtering /> <!--描述存放资源的目录,该路径相对POM路径 --> <directory /> <!--包含的模式列表,例如**/*.xml,只有符合条件的资源文件才会在打包的时候被放入到输出路径中 --> <includes /> <!--排除的模式列表,例如**/*.xml,符合的资源文件不会在打包的时候会被过滤掉 --> <excludes /> </resource> </resources> <!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 --> <testResources> <!--这个元素描述了测试相关的所有资源路径,子元素说明参考build/resources/resource元素的说明 --> <testResource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource> </testResources> <!--------------------- 插件管理 ---------------------> <!-- 子项目可以引用的默认插件信息。pluginManagement中的插件直到被引用时才会被解析或绑定到生命周期 --> <!-- 这里只是做了声明,并没有真正的引入。给定插件的任何本地配置都会覆盖这里的配置--> <pluginManagement> <!-- 可使用的插件列表 --> <plugins> <!--plugin元素包含描述插件所需要的信息。 --> <plugin> <!--插件在仓库里的group ID --> <groupId /> <!--插件在仓库里的artifact ID --> <artifactId /> <!--被使用的插件的版本(或版本范围) --> <version /> <!-- 是否从该插件下载Maven扩展(例如打包和类型处理器) --> <!-- 由于性能原因,只有在真需要下载时,该元素才被设置成enabled --> <extensions /> <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 --> <executions> <!--execution元素包含了插件执行需要的信息 --> <execution> <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 --> <id /> <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 --> <phase /> <!--配置的执行目标 --> <goals /> <!--配置是否被传播到子POM --> <inherited /> <!--作为DOM对象的配置 --> <configuration /> </execution> </executions> <!--项目引入插件所需要的额外依赖 --> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <!--任何配置是否被传播到子项目 --> <inherited /> <!--作为DOM对象的配置 --> <configuration /> </plugin> </plugins> </pluginManagement> <!--使用的插件列表 --> <plugins> <!--参见build/pluginManagement/plugins/plugin元素 --> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> <!--------------------- 构建扩展 ---------------------> <!--使用来自其他项目的一系列构建扩展 --> <extensions> <!--每个extension描述一个会使用到其构建扩展的一个项目,extension的子元素是项目的坐标 --> <extension> <!--项目坐标三元素:groupId + artifactId + version --> <groupId /> <artifactId /> <version /> </extension> </extensions> <!--------------------- 其他配置 ---------------------> <!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 --> <defaultGoal /> <!--构建产生的所有文件存放的目录 --> <directory /> <!--产生的构件的文件名,默认值是${artifactId}-${version}。 --> <finalName /> <!--当filtering开关打开时,使用到的过滤器属性文件列表 --> <filters /> </build> <repositories> <repository> <id>aliyun</id> <name>aliyun-maven</name> <url>https://maven.aliyun.com/repository/central</url> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://maven.aliyun.com/repository/spring</url> </repository> <repository> <id>shanguang-nexus</id> <name>maven-public</name> <url>http://www.shanguang.com/repository/maven-public/</url> </repository> <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
POM文件节点解释:
project:整个pom配置文件的根元素,所有的配置都是写在project元素里面的;
modelVersion:指定当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0(如果是Maven2、Maven 3就写死);
groupId:这是项目组的标识。它在一个组织或者项目中通常是唯一的。
artifactId:这是项目的标识,通常是工程的名称。它在一个项目组(group)下是唯一的。
version:这是项目的版本号,用来区分同一个artifact的不同版本。
packaging:这是项目产生的构件类型,即项目通过maven打包的输出文件的后缀名,包括jar、war、pom等。父级项目通常都是pom。
其中:groupId+artifactId+version被称为项目的坐标三元素
parent:用于指定父级项目,声明一些配置供子POM继承,maven的pom文件可以用于继承减少子级项目的配置,实现“一处声明,多处使用”的目的。做为父级项目的打包类型必须设置为POM。
所有项目的POM都默认继承自一个父pom(Super POM)。
超级pom路径如下:
在maven本地仓库的如下位置:
org\apache\maven\maven-model-builder\3.3.3
打开该路径下的如下jar包:
maven-model-builder-3.3.3.jar
在该jar包的如下路径下:
org\apache\maven\model\
可以找到超级pom:
pom-4.0.0.xml
modules:用于实现项目的聚合。如果我们想要一次构建多个项目,就可以创建一个项目使用modules节点配置需要聚合的项目。
dependencies:设置项目相关的所有依赖,这些依赖会自动从项目定义的仓库中下载
dependency:定义项目的其中一个依赖,要设置在dependencies元素中
exclusions:依赖排除,即告诉maven只依赖指定的项目,不依赖该项目的这些依赖。此元素主要用于解决版本冲突问题
scope:依赖范围,在项目发布过程中,决定哪些构件被包括进来
dependencyManagement:设置项目的依赖信息,但是在构建的时候不会实际被引入进来。是parent项目定义依赖配置的主要方式,子项目在需要相关依赖的时候只需要定义groupId+artifactId,由parent项目统一控制依赖的版本号。是用于统一项目组中依赖版本号的重要手段。
build:主要用来定义项目构建相关的信息
pluginManagement:插件管理相关配置,maven继承的Super POM,默认定义了一个远程插件仓库地址https://repo.maven.apache.org/maven2
repositories:用来定义远程仓库地址,是使用maven必须要理解的节点配置。
maven中仓库分为两类:本地仓库和远程仓库。
本地仓库:maven在构建项目的时候,会根据依赖坐标首先去本地仓库查看,如果本地仓库找不到,就会去远程仓库。本地仓库一般是在maven的seting.xml文件中的localRepository节点中定义,默认值是:${user.home}/.m2/repository
远程仓库:分为中央仓库、私服、其他公共库。maven继承的Super POM,默认定义了一个远程仓库地址https://repo.maven.apache.org/maven2。
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun-maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://maven.aliyun.com/repository/spring</url>
</repository>
</repositories>
下面来看一下Settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!--
| This is the configuration file for Maven. It can be specified at two levels:
|
| 1. User Level. This settings.xml file provides configuration for a single user,
| and is normally provided in ${user.home}/.m2/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -s /path/to/user/settings.xml
|
| 2. Global Level. This settings.xml file provides configuration for all Maven
| users on a machine (assuming they're all using the same Maven
| installation). It's normally provided in
| ${maven.home}/conf/settings.xml.
|
| NOTE: This location can be overridden with the CLI option:
|
| -gs /path/to/global/settings.xml
|
| The sections in this sample file are intended to give you a running start at
| getting the most out of your Maven installation. Where appropriate, the default
| values (values used when the setting is not specified) are provided.
|
|-->
<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
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- interactiveMode
| This will determine whether maven prompts you when it needs input. If set to false,
| maven will use a sensible default value, perhaps based on some other setting, for
| the parameter in question.
|
| Default: true
<interactiveMode>true</interactiveMode>
-->
<localRepository>C:\Users\${user.home}\.m2\repository</localRepository>
<!-- offline
| Determines whether maven should attempt to connect to the network when executing a build.
| This will have an effect on artifact downloads, artifact deployment, and others.
|
| Default: false
<offline>false</offline>
-->
<!-- pluginGroups
| This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
| when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
| "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
|-->
<pluginGroups>
<!-- pluginGroup
| Specifies a further group identifier to use for plugin lookup.
<pluginGroup>com.your.plugins</pluginGroup>
-->
</pluginGroups>
<!-- proxies
| This is a list of proxies which can be used on this machine to connect to the network.
| Unless otherwise specified (by system property or command-line switch), the first proxy
| specification in this list marked as active will be used.
|-->
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
-->
</proxies>
<!-- servers
| This is a list of authentication profiles, keyed by the server-id used within the system.
| Authentication profiles can be used whenever maven must make a connection to a remote server.
|-->
<servers>
<!-- server
| Specifies the authentication information to use when connecting to a particular server, identified by
| a unique name within the system (referred to by the 'id' attribute below).
|
| NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
| used together.
|
<server>
<id>deploymentRepo</id>
<username>repouser</username>
<password>repopwd</password>
</server>
-->
<!-- Another sample, using keys to authenticate.
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>optional; leave empty if not used.</passphrase>
</server>
-->
<server>
<id>shanguang-nexus</id>
<username>shanguang</username>
<password>123456</password>
</server>
</servers>
<!-- mirrors
| This is a list of mirrors to be used in downloading artifacts from remote repositories.
|
| It works like this: a POM may declare a repository to use in resolving certain artifacts.
| However, this repository may have problems with heavy traffic at times, so people have mirrored
| it to several places.
|
| That repository definition will have a unique id, so we can create a mirror reference for that
| repository, to be used as an alternate download site. The mirror site will be the preferred
| server for that repository.
|-->
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
<!-- profiles
| This is a list of profiles which can be activated in a variety of ways, and which can modify
| the build process. Profiles provided in the settings.xml are intended to provide local machine-
| specific paths and repository locations which allow the build to work in the local environment.
|
| For example, if you have an integration testing plugin - like cactus - that needs to know where
| your Tomcat instance is installed, you can provide a variable here such that the variable is
| dereferenced during the build process to configure the cactus plugin.
|
| As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles
| section of this document (settings.xml) - will be discussed later. Another way essentially
| relies on the detection of a system property, either matching a particular value for the property,
| or merely testing its existence. Profiles can also be activated by JDK version prefix, where a
| value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.
| Finally, the list of active profiles can be specified directly from the command line.
|
| NOTE: For profiles defined in the settings.xml, you are restricted to specifying only artifact
| repositories, plugin repositories, and free-form properties to be used as configuration
| variables for plugins in the POM.
|
|-->
<profiles>
<!-- profile
| Specifies a set of introductions to the build process, to be activated using one or more of the
| mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/>
| or the command line, profiles have to have an ID that is unique.
|
| An encouraged best practice for profile identification is to use a consistent naming convention
| for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.
| This will make it more intuitive to understand what the set of introduced profiles is attempting
| to accomplish, particularly when you only have a list of profile id's for debug.
|
| This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.
<profile>
<id>jdk-1.4</id>
<activation>
<jdk>1.4</jdk>
</activation>
<repositories>
<repository>
<id>jdk14</id>
<name>Repository for JDK 1.4 builds</name>
<url>http://www.myhost.com/maven/jdk14</url>
<layout>default</layout>
<snapshotPolicy>always</snapshotPolicy>
</repository>
</repositories>
</profile>
-->
<!--
| Here is another profile, activated by the system property 'target-env' with a value of 'dev',
| which provides a specific path to the Tomcat instance. To use this, your plugin configuration
| might hypothetically look like:
|
| ...
| <plugin>
| <groupId>org.myco.myplugins</groupId>
| <artifactId>myplugin</artifactId>
|
| <configuration>
| <tomcatLocation>${tomcatPath}</tomcatLocation>
| </configuration>
| </plugin>
| ...
|
| NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
| anything, you could just leave off the <value/> inside the activation-property.
|
<profile>
<id>env-dev</id>
<activation>
<property>
<name>target-env</name>
<value>dev</value>
</property>
</activation>
<properties>
<tomcatPath>/path/to/tomcat/instance</tomcatPath>
</properties>
</profile>
-->
</profiles>
<!-- activeProfiles
| List of profiles that are active for all builds.
|
<activeProfiles>
<activeProfile>alwaysActiveProfile</activeProfile>
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
</settings>
settings :settings节点是整个Settings.xml文件的根元素
localRepository:用于定义本地仓库的位置,本地仓库就是指maven这个软件在本地电脑存储依赖构件的位置
server:用于定义远程仓库需要的账号密码,就是repository(pom文件定义)定义的仓库地址,两者之间通过id节点关联。也就是说登录repository定义的远程仓库需要的账号密码就是server节点配置的账号密码
mirror:用于配置镜像地址,通过mirrorOf节点关联需要镜像的远程仓库地址,mirrorOf节点的值就是repository节点中id的值。比如
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
这个配置就是给默认的中央仓库设置一个镜像地址,默认的中央仓库地址在国外,国内访问比较慢且不稳定,这个时候就可以给中央仓库设置一个国内的镜像,这样访问中央仓库的时候就会去访问镜像设置的地址,可以改善仓库的访问速度。
repository中的id节点和server中的id节点的值需要一样,mirror中的mirrorOf节点和repository中的id节点的值需要一样,这个是初学者比较容易忽略的地方
参考:
https://blog.csdn.net/qq_40419080/article/details/116464380
https://blog.csdn.net/wangwei021933/article/details/127817432