一次项目漏洞升级的过程(JDK8升级到JDK17)

发布时间:2024年01月19日

准备工作:

第一步、漏洞扫描工具trivy;
第二步、扫描后的漏洞存在镜像漏洞,中间件漏洞和代码jar包漏洞;
第三步、区分对外和不对外的服务,先更新对外服务;
第四步、找出一个对外服务需要升级的jar
1、spring-web需要升级到6.x,spring-boot需要升级到3.x,JDK需要升级到JDK17(Oracle JDK17三年免费授权从2021年9月到2024年9月,现在已经2024年了,所以需要使用OpenJDK17),Java EE转Jakarta;因为使用了OpenJdk17,cglib代理在2019年8月停止更新,OpenJDK17是2019年9月出来的,也不支持需要修改;
第五步、OpenJDK17需要使用IDEA2022.x才行,升级IDEA;
第六步、下载OpenJDK17

开始处理

第一步、升级OpenJDK(解压好就可以了);
第二步、更新IDEA的JDK配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二步、更新Maven配置
在这里插入图片描述
在这里插入图片描述
第三步、升级Jar包,根据具体使用到的jar更新

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.faces</groupId>
            <artifactId>jakarta.faces-api</artifactId>
            <version>3.0.0</version> <!-- 使用适当的版本号 -->
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>4.0.2</version>
        </dependency>

第四步、Java EE转Javarta EE
在这里插入图片描述
第五步、更新Cglib

<dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy-agent</artifactId>
            <version>1.14.11</version>
        </dependency>
        <dependency>
            <groupId>net.bytebuddy</groupId>
            <artifactId>byte-buddy</artifactId>
            <version>1.14.11</version>
        </dependency>
 inst = new ByteBuddy()
 						//以前cglib代理类
                        .subclass(代理类.class)
                        .method(ElementMatchers.any())
                        //以前cglib代理方法,proxy就是代理对象
                        .intercept(InvocationHandlerAdapter.of((proxy, method, args) -> intercept(proxy, method, args)))
                        .make()
                        .load(MyJedis.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
                        .getLoaded().newInstance();

制作镜像

第一步、制作基础镜像
选择的是alpine

#执行命令 
docker pull alpine
#查看镜像,一般是最前面一个
docker images
#登录镜像
docker run -it 镜像ID /bin/sh
#更新安装包
apk update
# 安装OpenJDK等
apk add openjdk17 busybox tzdata curl
#安装/bin/bash
apk add bash
#从新打开一个窗口,把容器打包成镜像
docker commit 容器ID xxx.xxx.xxx:alpine-openjdk17-base
#上传镜像
docker push 域名:/位置

第二步、更新Dockerfile文件

#获取基础镜像
FROM 域名:/位置/alpine-openjdk17-base
#设置环境变量
ENV JVM_OPTS -Xms1024m -Xmx1024m
ENV application xxxxx
ENV apollo false
#从根目录创建文件夹名称
RUN mkdir -p /app/$application/conf
COPY target/$application /app/$application
WORKDIR /app/$application
#执行命令
CMD exec java -Dapollo.enable=${apollo} -Denv=${ENV} --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.cs=ALL-UNNAMED $JAVA_OPTS $JVM_OPTS -jar -Xbootclasspath/a:conf xxxxx.jar

如果存在-XX:+UseConcMarkSweepGC JVM参数,需要移除,JDK17已经没有这个垃圾回收器了;

使用了.gitlab-ci.yml需要更新文件,指定JDK版本

第一步、在GitLab服务器上上传解压的JDK17,获取解压路径;
第二步、在编译时指定编译JDK;
在这里插入图片描述

流水线打包

在这里插入图片描述

镜像发布

在这里插入图片描述

文章来源:https://blog.csdn.net/xionglangs/article/details/135690742
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。