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/