超级pom
- 超级pom
所有的maven项目的pom文件都扩展自超级pom。超级pom定义了一组被所有项目共享的默认设置。你可以在maven安装路径的lib目录的maven-model-builder.jar中找到
最简单的pom
1 | #初始化的maven项目pom.xml内容如下: |
pom语法
项目坐标
- groupId
定义了项目属于哪个组,这个组往往和项目所在的组织或者公司存在关联,比如cn.com.servyou - artifactId
定义了maven项目在组中的唯一的id,可以认为是组中子项目唯一标识符 - version
指定了子项目的当前版本 - packaging
指定了项目的打包方式,默认情况下打成jar包 - classifier
用来定义构件输出的一些附属构件,因为附属构件拥有相同的groupId,artifactId,version,需要和真正的项目构件区分开
添加依赖
1 | #比如增加junit的依赖 |
依赖排除
1 | #依赖的jar还会依赖其他的jar,有时候会产生冲突,需要排除对其对依赖 |
依赖范围
依赖的范围大致分成以下5种:
- compile - 编译依赖范围
- test - 测试依赖范围
- provided - 已提供依赖范围
- runtime - 运行时依赖范围
- system - 系统依赖范围
依赖范围会对编译,测试,运行时的classpath产生影响:
依赖范围(scope) | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行时classpath有效 | 例子 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | Spring-core |
test | – | Y | – | Junit |
provided | Y | Y | – | servlet-api |
runtime | – | Y | Y | JDBC驱动实现 |
system | Y | Y | – | 本地的,Maven仓库之外的类库文件 |
依赖范围还会对传递性依赖产生影响:
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | — | — | runtime |
test | test | — | — | test |
provided | provided | — | provided | provided |
runtime | runtime | — | — | runtime |
1 | #比如对于Junit的依赖只针对测试的classpath: |
pom文件继承
和java中的继承一样,pom文件也可以继承:1
2
3
4
5
6
7<parent>
<groupId>父模块groupId</groupId>
<artifactId>父模块artifactId</artifactId>
<version>父模块version</version>
<relativePath>相对路径</relativePath>
</parent>
#其中父模块packaging参数必须为pom,由于父模块只是为了消除配置的重复,因此也就不需要src/main/java等目录了
模块聚合
当一个项目有多个模块的时候,我们需要到各个模块去执行mvn命令进行构建,如何才能在一个模块下构建所有的模块呢?模块聚合配置就是为了解决这个问题:1
2
3
4
5
6<modules>
<module>模块1 name</module>
<module>模块2 name</module>
....
</modules>
#该配置配置在parent pom文件中,只需对parent模块进行maven构建等操作,maven会根据modules配置计算出构建的反应堆,分别进行各个模块的构建
统一的版本管理
项目多模块的情况下,每个模块可能会依赖同一个jar包,为了防止版本的泛滥,需要有一个版本管理:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<properties>
<junit.version>4.0.0-RELEASE</tax.common.version>
....
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
....
<dependencies>
<dependencyManagement>
#maven使用dependencyManagement标签来约束依赖的使用,在dependencyManagement声明的依赖不会实际引入,即能让子模块继承到父模块的依赖配置,又能保证子模块使用的灵活性