maven-pom文件

超级pom

  • 超级pom
    所有的maven项目的pom文件都扩展自超级pom。超级pom定义了一组被所有项目共享的默认设置。你可以在maven安装路径的lib目录的maven-model-builder.jar中找到

最简单的pom

1
2
3
4
5
6
7
8
9
10
11
12
#初始化的maven项目pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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>

<groupId>cn.com.wyc</groupId>
<artifactId>maven-test</artifactId>
<version>1.0-SNAPSHOT</version>

</project>

pom语法

项目坐标

  • groupId
    定义了项目属于哪个组,这个组往往和项目所在的组织或者公司存在关联,比如cn.com.servyou
  • artifactId
    定义了maven项目在组中的唯一的id,可以认为是组中子项目唯一标识符
  • version
    指定了子项目的当前版本
  • packaging
    指定了项目的打包方式,默认情况下打成jar包
  • classifier
    用来定义构件输出的一些附属构件,因为附属构件拥有相同的groupId,artifactId,version,需要和真正的项目构件区分开

添加依赖

1
2
3
4
5
6
7
8
9
#比如增加junit的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</<dependency>
</dependencies>
#其实就是将第三方项目的坐标添加到<dependency></<dependency>标签下

依赖排除

1
2
3
4
5
6
7
8
9
10
11
12
#依赖的jar还会依赖其他的jar,有时候会产生冲突,需要排除对其对依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<exclusions>
<exclusion>
<groupId>排除项目的groupId</groupId>
<artifactId>排除项目的artifactId</artifactId>
</exclusion>
</exclusions>
</<dependency>

依赖范围

依赖的范围大致分成以下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
2
3
4
5
6
7
#比如对于Junit的依赖只针对测试的classpath:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>

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声明的依赖不会实际引入,即能让子模块继承到父模块的依赖配置,又能保证子模块使用的灵活性

显示 Gitment 评论