昨天在修 log4j 漏洞突然有一点疑问,请各位大佬解惑: 首先自己的服务是 maven 和 spring-boot 构建的,昨天先用 mvn dependency:tree -Dincludes=log4j 排查了自己的微服务 A 用的 log4j 2.11 是在第三方包 elasticsearch-6.43 下面,然后根据以往经验,就在自己的 A 服务的 pom.xml 中显示添加 log4j 2.15.0 版本,之前自己服务的 pom 是没有显示声明的,重新打包构建 mvn package。打好包 A.jar 后又将其解压看了下 BOOT-INFO/lib 下面 log4j 相关包都是 2.15.0 了,然后我又解压同目录下的 elasticsearch-6.43.jar 包,下面都是 classes 文件。一开始感觉很理所当然,但突然有几个问题:
- 显式的在自己服务的 pom 文件声明使用的依赖包比如 log4j 一定会覆盖下层第三方包依赖的 log4j 吗?这是由 maven 的什么机制决定的?
- 虽然自己的 A 服务用 pom 里声明的 log4j 2.15 版本构建出来 jar 包,也就是 classes 文件(我理解为二进制),但它依赖的 elasticsearch-6.43 jar 包 classes 不是已经是根据老版本的 log4j 2.11 构建出来的吗?所以 elasticsearch 这个 jar 包不是还是有问题,还是没有根本解决项目的 log4j 的漏洞问题?难道说 java 的 classes 文件是像动态链接库一样,运行时 elasticsearch-6.43 jar 会调用 2.15 的 log4j jar 包?这是 Java 的什么机制呢?
