準(zhǔn)備工作:
第一步、漏洞掃描工具trivy;
第二步、掃描后的漏洞存在鏡像漏洞,中間件漏洞和代碼jar包漏洞;
第三步、區(qū)分對外和不對外的服務(wù),先更新對外服務(wù);
第四步、找出一個(gè)對外服務(wù)需要升級的jar
1、spring-web需要升級到6.x,spring-boot需要升級到3.x,JDK需要升級到JDK17(Oracle JDK17三年免費(fèi)授權(quán)從2021年9月到2024年9月,現(xiàn)在已經(jīng)2024年了,所以需要使用OpenJDK17),Java EE轉(zhuǎn)Jakarta;因?yàn)槭褂昧薕penJdk17,cglib代理在2019年8月停止更新,OpenJDK17是2019年9月出來的,也不支持需要修改;
第五步、OpenJDK17需要使用IDEA2022.x才行,升級IDEA;
第六步、下載OpenJDK17
開始處理
第一步、升級OpenJDK(解壓好就可以了);
第二步、更新IDEA的JDK配置
第二步、更新Maven配置
第三步、升級Jar包,根據(jù)具體使用到的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> <!-- 使用適當(dāng)?shù)陌姹咎?-->
</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,可能需要升級,否則編譯報(bào)錯(cuò)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<optional>true</optional>
</dependency>
Spring-boot 3.x已經(jīng)不使用WebMvcConfigurerAdapter實(shí)現(xiàn)MVC定制,需要替換為WebMvcConfigurer,可以繼承WebMvcConfigurationSupport
使用的HandlerInterceptorAdapter可能不能使用,可以實(shí)現(xiàn)HandlerInterceptor代替
使用了Swagger2,需要移除,swagger2使用javax.servlet.http.HttpServletRequest,會(huì)出現(xiàn)Type javax.servlet.http.HttpServletRequest not present錯(cuò)誤,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));
}
}
標(biāo)簽替換,使用IDEA的批量替換功能,根據(jù)項(xiàng)目實(shí)際情況調(diào)整,可以刪除一些不知道的屬性
@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轉(zhuǎn)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();
制作鏡像
第一步、制作基礎(chǔ)鏡像
選擇的是alpine
#執(zhí)行命令
docker pull alpine
#查看鏡像,一般是最前面一個(gè)
docker images
#登錄鏡像
docker run -it 鏡像ID /bin/sh
#更新安裝包
apk update
# 安裝OpenJDK等
apk add openjdk17 busybox tzdata curl
#安裝/bin/bash
apk add bash
#從新打開一個(gè)窗口,把容器打包成鏡像
docker commit 容器ID xxx.xxx.xxx:alpine-openjdk17-base
#上傳鏡像
docker push 域名:/位置
第二步、更新Dockerfile文件
#獲取基礎(chǔ)鏡像
FROM 域名:/位置/alpine-openjdk17-base
#設(shè)置環(huán)境變量
ENV JVM_OPTS -Xms1024m -Xmx1024m
ENV application xxxxx
ENV apollo false
#從根目錄創(chuàng)建文件夾名稱
RUN mkdir -p /app/$application/conf
COPY target/$application /app/$application
WORKDIR /app/$application
#執(zhí)行命令,在反射時(shí),會(huì)拋出模塊等異常,需要加入add-opens參數(shù)
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參數(shù),需要移除,JDK17已經(jīng)沒有這個(gè)垃圾回收器了;
使用了.gitlab-ci.yml需要更新文件,指定JDK版本
第一步、在GitLab服務(wù)器上上傳解壓的JDK17,獲取解壓路徑;
第二步、在編譯時(shí)指定編譯JDK;
流水線打包
文章來源:http://www.zghlxwxcb.cn/news/detail-809308.html
鏡像發(fā)布
文章來源地址http://www.zghlxwxcb.cn/news/detail-809308.html
到了這里,關(guān)于一次項(xiàng)目漏洞升級的過程(JDK8升級到JDK17)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!