settings.xml
settings.xml是maven的全局配置文件
settings.xml文件一般存在于两个位置:
1.全局配置: {user.home}/.m2/settings.xml
用户配置优先级高于全局配置
顶级标签
<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/>
<!--构建系统本地仓库的路径,默认值是~/.m2/repository -->
<interactiveMode/>
<!--表示maven是否需要和用户交互以获得输入(默认为true),如果需要则设置为true == <interactiveMode>true</interactiveMode> -->
<usePluginRegistry/>
<!--表示maven是否需要使用plugin-registry.xml文件来管理插件版本(默认为false),如果需要让maven使用文件~/.m2/plugin-registry.xml来管理插件版本,则设为true -->
<offline/>
<!--表示maven是否需要在离线模式下运行,默认为false-->
<pluginGroups/>
<!--当插件的组织id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表-->
<servers/>
<!--一般,仓库的下载和部署是在pom.xml文件中的repositories和distributionManagement元素中定义的。然而,一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在settings.xml中-->
<mirrors/>
<!--为仓库列表配置的下载镜像列表-->
<proxies/>
<!--用来配置不同的代理-->
<profiles/>
<!--根据环境参数来调整构建配置的列表,它包含了id、activation、repositories、pluginRepositories和 properties元素,如果一个settings.xml中的profile被激活,它的值会覆盖任何其它定义在pom.xml中带有相同id的profile-->
<activeProfiles/>
<!--该元素包含了一组activeProfile元素,每个activeProfile都含有一个profile id。任何在activeProfile中定义的profile id,不论环境设置如何,其对应的 profile都会被激活。如果没有匹配的profile,则什么都不会发生-->
</settings>
二级标签
profile标签
pom
pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
pom.xml
一级标签
</groupId>
<!--项目或者组织的唯一标志-->
</artifactId>
<!--项目的通用名称-->
</version>
<!--项目的版本-->
</packaging>
<!--打包机制,例如pom jar等-->
<!--groupId,artifactId,version,packaging作为项目唯一坐标-->
</classifier>
<!--分类-->
</url>
<!--开发团队官方地址,非必要-->
</dependencies >
<!--所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承-->
</dependencyManagement>
<!--在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,从而控制所有子项目的依赖项的版本统一,所以让子项目中引用一个依赖可以不用显示的列出版本号,maven会根据父子关系向上寻找一个dependencyManagement中存在这个依赖项并获取版本信息-->
dependencies与dependencyManagement 的区别:
dependencyManagement仅仅是声明依赖并不会真正地注入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom,但是如果子项目中已经指定了version则不会向上寻找而直接使用该版本的jar。
二级标签
dependency
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
<type >jar</ type >
<optional >true</ optional >
</exclusions>
</dependency>
groupId,artifactId,version,packaging定义了一个具体的依赖项
optional:设置指依赖是否可选,默认为false,即子项目默认都继承,为true,则子项目必需显示的引入,与dependencyManagement里定义的依赖类似
exclusions:如果X需要A,A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion
scope:用来指定当前包的依赖范围
- compile(编译范围),是默认的范围,编译范围依赖在所有的classpath中可用,同时它们也会被打包。
- provided(已提供范围),只有在当JDK或者一个容器已提供该依赖之后才使用。
- runtime(运行时范围),在运行和测试系统的时候需要。
- test(测试范围),在一般的 编译和运行时都不需要。
- system(系统范围),与provided类似
在dependencyManagement中的dependency可以使用scope=import来解决pom单继承问题,即可以将杂乱冗长的parent 分成多个model
pom关系
- 依赖关系:就是一个dependency
- 继承关系:子pom与父pom的关系,父pom用来进行统一的版本关系,注意此时packaging必须为pom
- 聚合关系:
总pom
<modules>
<!-- 这里配置的不是artifactId,而是这个模块的目录名称-->
<module>module-1</module>
<module>module-2</module>
<module>module-3</module>
</modules>
子pom
<!-- 声明总项目的坐标 -->
<parent>
<groupId>org.clf.parent</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
</parent>
继承与聚合都属于父子关系, 不同的是对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。对于继承关系的父 POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父 POM是什么,在实际项目中,一个 POM往往既是聚合POM,又是父 POM,它继承了某个项目,本身包含几个子模块,同时肯定会存在普通的依赖关系,就是说,依赖、继承、聚合这三种关系是并存的