Maven optional 的作用,这个属性怎么用?

Maven 的学习任重道远,我没系统性学习,都是碰到问题,解决问题,记录总结。像之前零散分享的:

Maven scope

Maven profile

Maven 多模块项目

今天要分享 Maven optional 的使用,自作聪明碰到的问题。

公司项目打包出来 Jar 非常大,想做优化,从简单的 Maven 依赖管理开始,我们依赖比较随意,只要不陷入死循环,或产生冲突,其实都无所谓。

但为了优化,我开始检查依赖,发现 redis 依赖可优化空间大,原代码是这样的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId> 
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <optional>true</optional>
        </dependency>

我们用来连接 redis 的客户端是 Jedis,我了解到 spring-boot-starter-data-redis 本身就集成依赖了 Lettuce,去代码中查看,发现还真是。

行,这个用不着,将它排除。

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

我继续往spring-data-redis里面翻依赖,竟然看到 Jedis,以为它也被集成,那外面的 Jedis 是不是可以去掉。

		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>${jedis}</version>
			<optional>true</optional>
		</dependency>

结果去掉后代码运行就报错了。

RedisConfig required a bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' that could not be found.
Bean method 'redisConnectionFactory' in 'JedisConnectionConfiguration' not loaded

好吧,看来不对,原因就在上面的 <optional>true</optional>

optional 表示“可选”,如果要简单粗暴理解:使用它,表示这个 Jar 不能被传递依赖,如果将它删掉,或者将它改成 false ,就能传递依赖。

<optional>false</optional>

难怪我在 Maven 依赖树中也没找到这个 Jar ,当然,将 optional 属性设置成 true 后,这个 Jar 也不会被构建到项目去

所以,你会发现这个这个属性作用不大。它只是代表你可以选择使用这个 Jar ,比如这里用在 Jedis 上,它代表你可以选择将 Jedis 当作客户端连接 Redis,但如果我外部代码真的选择用 Jedis,那我还得另外在 pom.xml 添加 Jedis 的依赖。

本文由老郭种树原创,转载请注明:https://guozh.net/maven-optional/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注