准备工作:
第一步、漏洞扫描工具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>
使用了lombok,可能需要升级,否则编译报错
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<optional>true</optional>
</dependency>
Spring-boot 3.x已经不使用WebMvcConfigurerAdapter实现MVC定制,需要替换为WebMvcConfigurer,可以继承WebMvcConfigurationSupport
使用的HandlerInterceptorAdapter可能不能使用,可以实现HandlerInterceptor代替
使用了Swagger2,需要移除,swagger2使用javax.servlet.http.HttpServletRequest,会出现Type javax.servlet.http.HttpServletRequest not present错误,OpenJDK17使用Jakarta;替换为
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>3.0.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>2.9.2</version>-->
<!-- </dependency>-->
@Configuration
public class Swagger3Configuration {
/**
* 版本
*/
private static final String VERSION = "1.0.0";
private static final String TITLE = "Tracker-API";
private static final String DESCRIPTION = "Tracker-API接口文档";
@Bean
public OpenAPI springOpenAPI() {
return new OpenAPI().info(new Info()
.title(TITLE)
.description(DESCRIPTION)
.version(VERSION));
}
}
标签替换,使用IDEA的批量替换功能,根据项目实际情况调整,可以删除一些不知道的属性
@Api(tags = "")→@Tag(name = "")
@ApiIgnore→或@Parameter(hidden = true)@Operation(hidden = true)@Hidden
@ApiImplicitParam→@Parameter
@ApiParam→@Parameter
@ApiImplicitParams→@Parameters
@ApiModel(value = "", description= "") → @Schema(name= "", description= "")
@ApiModelProperty(value = "", required = true, hidden = true)→@Schema(name= "", required = true, accessMode = READ_ONLY)
@ApiOperation(value = "", notes = "")→@Operation(summary = "", description = "")
@ApiResponse(code = 404, message = "") → @ApiResponse(responseCode = "404", description = "")
第四步、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
#执行命令,在反射时,会抛出模块等异常,需要加入add-opens参数
CMD exec java -Dapollo.enable=${apollo} -Denv=${ENV} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --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://www.toymoban.com/news/detail-809308.html
镜像发布
文章来源地址https://www.toymoban.com/news/detail-809308.html
到了这里,关于一次项目漏洞升级的过程(JDK8升级到JDK17)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!