文章

使用自定义maven pom依赖项目实现spring boot工程包版本管理

使用自定义maven pom依赖项目实现spring boot工程包版本管理

使用自定义maven pom依赖项目实现spring boot工程包版本管理

自定义parentdependency模块,整合开发中常用到的spring-boot-dependencies和其他私有依赖。

pom项目优点

  • 依赖包和版本号集中在一个文件做统一管理。适合制定统一规范,方便版本更新(如公共包有安全漏洞要做版本升级的场景)。还可以配合maven archetype搭建自定义脚手架。
  • 版本只需要声明一次,就能屏蔽下级引用的版本冲突。
  • 支持继承parent和组合dependencies两种方式灵活使用。

pom项目定义

pom项目和普通maven工程类似,有pom.xml定义,但packaging标签打包类型为pom,和常见的jarwar不同。

文件构成

  • ctm-spring-boot-pom-project
    • ctm-spring-boot-starter-parent
      • pom.xml
    • ctm-spring-boot-dependencies
      • pom.xml

maven工程构建成果为.pom文件,发布上传到maven私有仓库。

parent模块pom定义

在本pom.xml中,自定义父工程,结合自定义dependency使用,用来屏蔽其他parent引入的dependencyManagement。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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">
    <parent>
        <groupId>com.xxx</groupId>
        <artifactId>ctm-spring-boot-dependencies</artifactId>
        <version>0.0.1.RELEASE</version>
    </parent>
    <groupId>com.xxx</groupId>
    <artifactId>ctm-spring-boot-starter-parent</artifactId>
    <version>0.0.1.RELEASE</version>
    <packaging>pom</packaging>
    <modelVersion>4.0.0</modelVersion>
    <name>ctm-spring-boot-starter-parent</name>

    <properties>
        <java.version>1.8</java.version>
        <resource.delimiter>@</resource.delimiter>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencyManagement>
        <dependencies></dependencies>
    </dependencyManagement>

    <build>
		<!-- 略,copy from spring-boot-starter-parent-x.x.x.pom -->
    </build>

    <distributionManagement>
        <repository>
            <id>ctm-release</id>
            <name>ctm-release</name>
            <url>xxx</url>
        </repository>
        <snapshotRepository>
            <id>ctm-snapshot</id>
            <name>ctm-snapshot</name>
            <url>xxx</url>
        </snapshotRepository>
    </distributionManagement>

</project>

dependencies模块pom定义

在本pom.xml中,声明依赖包和版本,做全局统一管理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?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">

    <groupId>com.xxx</groupId>
    <artifactId>ctm-spring-boot-dependencies</artifactId>
    <version>0.0.1.RELEASE</version>
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <name>ctm-spring-boot-dependencies</name>

    <dependencyManagement>
		<!-- add your dependencies -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>x.x.x</version>
                <exclusions>
                    <exclusion>
                        <groupId>*</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <distributionManagement>
        <repository>
            <id>ctm-release</id>
            <name>ctm-release</name>
            <url>xxx</url>
        </repository>
        <snapshotRepository>
            <id>ctm-snapshot</id>
            <name>ctm-snapshot</name>
            <url>xxx</url>
        </snapshotRepository>
    </distributionManagement>
</project>

pom项目引用

本地maven配置

使用时修改maven的settings.xml文件:
1、在<profiles>节点新增一组<profile>配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<profile>
	<id>ctm-release</id>
	<repositories>
		<repository>
			<id>ctm-release</id>
			<name>ctm-release</name>
			<url>xxx</url>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
	</repositories>
<profile>       

2、在<activeProfiles>节点新增<activeProfile>配置。

1
<activeProfile>ctm-release</activeProfile>

pom项目使用

方式一:继承(推荐)

1、在项目根pom,将原parent的spring-boot-starter-parent改为骨架工程。

1
2
3
4
5
<parent>
    <groupId>com.xxx</groupId>
    <artifactId>ctm-spring-boot-starter-parent</artifactId>
    <version>${last.version.RELEASE}</version>
</parent>

2、删除项目原<dependencyManagement>节点
3、在<dependencies>节点中引用依赖时,不要显式声明依赖的版本号,会自动继承<dependencyManagement>节点中声明的。在多模块项目中,对子模块也适用。

方式二:组合

原项目已经继承私有parent(非原生spring-boot-starter-parent),使用骨架提供dependencies模块,以组合的方式使用,做依赖包版本控制。
1、在项目根pom的<dependencyManagement>节点,添加以下配置

1
2
3
4
5
6
7
<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>ctm-spring-boot-dependencies</artifactId>
    <version>${last.version.RELEASE}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
1
注:若版本控制失效,一般是父级私有parent内也声明有一份dependencyManagement,导致子的失效。在本级需要把引用type pom的方式,改为显式声明,手动复制所有dependency到dependencyManagement节点内。

2、在<dependencies>节点中引用依赖,不用带版本号。

附maven标签功能简介

dependencyManagement简介

依赖包版本的管理器,dependencyManagement里只是声明依赖,并不实现引入。

  • 版本控制:如果dependencies里的dependency没有声明version元素,那么maven就会到dependencyManagement里面去找有没有对该artifactId和groupId进行过版本声明,如果有,就继承它。
  • 中断:如果dependencies中的dependency声明了version,那么无论dependencyManagement中有无对该jar的version声明,都以dependency里的version为准。

在引用<type>pom</type>类型时,一般结合<scope>import</scope>一起使用。

type pom简介

dependency的type类型默认是jar。当项目中需要引入很多jar包,容易导致单个pom.xml文件过大,可读性降低。可以单独定义一个type类型为pom的maven项目,做依赖包统一管理,不需要到处定义。使用时直接引用,利用maven依赖传递特性。

本文由作者按照 CC BY 4.0 进行授权