问题描述
如下图所示,对于 java 项目某些依赖,IDEA 提示,引用了含有漏洞的依赖。如果是单个依赖,可以考虑直接升级版本即可。但是对于传递性依赖,比如 flink 项目中,依赖的部分模块,它们自己依赖了一些含有漏洞的依赖,应该如何解决呢 ?(现实开发环境更新flink版本往往会带来非常多的麻烦和较大的风险)
解决方法
根据提示,找到提示包含漏洞的依赖包,然后前往 https://mvnrepository.com/ 搜索最新的依赖包。注意一定要查询一下是否兼容
。
步骤 1:使用 exclusion 排除有漏洞的依赖
xml
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.smileyan</groupId>
<artifactId>hello-flink-1.18</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.18.1</flink.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
<!-- 解决传递性依赖 vulnerable 问题 -->
<exclusions>
<exclusion>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 解决传递性依赖 vulnerable 问题 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.18.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.27.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
更新后,记得重新加载 maven 依赖。
Step 2:修改 flink 环境
如果设置线上的 flink 环境,建议上传无漏洞版本的依赖到 flink-1.18.1/lib
目录下。flink 在启动任务的时候,将会自动优先加载 这个目录下的依赖,而不是加载默认的以前的老版本依赖。
Notice`:如果不能修改 flink 环境(更推荐)
即使用新的无漏洞版本的依赖,并且 scope 去除 provided
,如下图所示:
这里还有一个地方需要注意,添加打包插件
(在 project 级别下添加)
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<!-- 根据实际情况设置是否 minimizeJar -->
<!-- <minimizeJar>true</minimizeJar>-->
</configuration>
</plugin>
</plugins>
</build>
总结
之前写了篇博客 rovides transitive vulnerable dependency maven:commons-collections 有两位小伙伴评论,认为博客中提到的解决方案是 "掩耳盗铃"。哈哈哈哈,当时能想到的仅仅是这样了。
多谢那两位小伙伴的提醒,多谢多谢 @zyfhongyang @zhongyilangren
通过本文提到的方法,可以较好的解决 "传递性依赖存在漏洞" 的解决方法,并且针对于 flink 应用,这里根据能否编辑 flink 环境给出了两个解决方案以供选择。
希望能帮到各位小伙伴 ~ 万分感谢各位的点赞、评论与关注支持 ~