概述

由来

起初Hutool只提供了两种引入方式:

  1. 引入hutool-all以便使用所有工具类功能

  2. 引入hutool-xxx单独模块使用

后来t-io的作者谭总提出是否可以引入一个bom包,一次性引入所有子模块,然后将不用的模块排除掉。起初我是排斥的,认为这种方式用处不大(其实是我不会写……)

再后来接触了Maven的这部分,于是有了hutool-bom模块!

当然这个模块的存在一直有争议,因为真正的bom包是一个模块管理包,正确的打开方式是可以引入,再引入需要的模块(只是不用重复版本号而已),Hutool中"排除"方式就变得非常异类,真是让人头大。

当然转机来自于一个issue:BOM should be declared in dependencyManagement for import

@JasonMing 大神给了一个非常棒的方案,可以两者兼得,于是纠结症的我终于释怀了,现在的bom模块变得异常灵活!

介绍

整个bom模块只由一个pom.xml组成,同时提供了dependencyManagementdependencies两种声明。于是我们就可以针对不同需要完成引入。

使用

import方式

如果你想像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-bom</artifactId>
            <version>${hutool.version}</version>
            <type>pom</type>
            <!-- 注意这里是import -->
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在子模块中就可以引入自己需要的模块了:

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
    </dependency>
</dependencies>

使用import的方式,只会引入hutool-bom内的dependencyManagement的配置,其它配置在这个引用方式下完全不起作用。

exclude方式

如果你引入的模块比较多,但是某几个模块没用,你可以:

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-bom</artifactId>
        <version>${hutool.version}</version>
        <!-- 加不加这句都能跑,区别只有是否告警  -->
        <type>pom</type>
        <exclusions>
            <exclusion>
                    <groupId>cn.hutool</groupId>
                    <artifactId>hutool-system</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

这个配置会传递依赖hutool-bom内所有dependencies的内容,当前hutool-bom内的dependencies全部设置了version,就意味着在maven resolve的时候hutool-bom内就算存在dependencyManagement也不会产生任何作用。