一、聚合
来看如下工程目录结构:
与传统的单个项目结构不同,此项目把一个项目拆分成了好几个模块,如核心代码在core中,jsp页面在app中(亦有将dao层、service层等拆分成不同的模块),这种情况就构成了Maven的聚合(或者称为多模块)。
最外层仅包含一个pom文件,其目的是帮助聚合其他模块构建,如下:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sto.bsp</groupId>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>3.0.0-SNAPSHOT</version>
<name>bsp Parent POM</name>
<description>Mobile Clinical Solution</description>
<modules>
<module>bsp-core</module>
<module>bsp-rest</module>
<module>bsp-openapi</module>
<module>bsp-task</module>
<module>bsp-app</module>
</modules>
→此pom将聚合和继承结合在了一起,下面会提到,我们先关注它的packaging和modules标签,对于聚合模块,其打包方式只能为pom,module标签中分别对应被聚合模块的目录名称,一般应当将其artifactId也设成目录名称,保持一致。
二、继承
继续看上述pom文件中的artifactId和pom标签,对于父模块,其打包方式也为pom,artifactId声明父模块的命名,此时配置子模块中的pom如下:
<parent>
<groupId>com.sto.bsp</groupId>
<artifactId>parent</artifactId>
<version>3.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.sto.bsp</groupId>
<artifactId>bsp-app</artifactId>
<packaging>war</packaging>
<name>bsp Application</name>
→此处用parent标签声明了一个父模块,relativePath指明父模块位置,默认值为../pom.xml,即在上一层目录下。子模块隐式省略了version,表明继承父模块,groupId和父模块一致,也可以隐式省略,除了groupId和version,properties自定义Maven属性,dependencies项目依赖配置等也可以从父模块继承。
三、依赖管理
由于依赖时可继承的,但也存在一个问题,假设又增加了一个模块,这个模块只用到了其中的几个依赖,显然不能让它依赖其他无关的依赖。Maven提供的dependencyManagement既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。
父pom中依赖如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>2.3.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.sto.bsp</groupId>
<artifactId>bsp-core</artifactId>
<version>${bsp-version}</version>
</dependency>
...
</dependencyManagement>
子pom中只需要将用到的依赖声明即可(只需简单的配置groupId和artifactId),如下:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
</dependency>
<dependency>
<groupId>com.sto.bsp</groupId>
<artifactId>bsp-core</artifactId>
</dependency>
...
</dependencies>
同样,可用dependencyManagement来配置插件管理。