起因

自己跑的一些小项目之前在低成本的阿里云上,为了节省内存是跑在adoptopenjdk/openjdk8-openj9:alpine-slim这个docker下。

基本上每个java的容器堆内存最高不需要超过512m,大部分256m甚至128m都可以跑的起来。

年前趁着国补买了一台SER7放在家里装了PVE当成Home Server,阿里云的机器只用来作为frp穿透出口。所以现在内存已经不再是瓶颈了,就可以把现有项目的jdk升级到jdk21

修改的内容

pom文件

因为有用到grpc,根据grpc-spring-boot-starter的介绍最高只能用spring-boot 3.2.4 和 spring-cloud 2023.0.0

    <spring-boot-dependencies.version>3.2.4</spring-boot-dependencies.version>
    <spring-cloud-dependencies.version>2023.0.0</spring-cloud-dependencies.version>
    <spring-boot-maven-plugin.version>3.2.4</spring-boot-maven-plugin.version>
    <servlet-api.version>6.0.0</servlet-api.version>
    <mybatis-plus-boot-starter.version>3.5.10.1</mybatis-plus-boot-starter.version>
    <mybatis-plus-join-starter.version>1.5.2</mybatis-plus-join-starter.version>
    <dynamic-datasource-starter.version>4.3.1</dynamic-datasource-starter.version>

    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>
    
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot-dependencies.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud-dependencies.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
-        <artifactId>mybatis-plus-boot-starter</artifactId>
+        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>${mybatis-plus-boot-starter.version}</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
-        <artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
+        <artifactId>mybatis-plus-jsqlparser</artifactId>
        <version>${mybatis-plus-boot-starter.version}</version>
    </dependency>
    <dependency>
       <groupId>com.baomidou</groupId>
-      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+      <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
       <version>${dynamic-datasource-starter.version}</version>
     </dependency>
     <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
+      <groupId>jakarta.servlet</groupId>
+      <artifactId>jakarta.servlet-api</artifactId>
       <version>${servlet-api.version}</version>
       <scope>provided</scope>
     </dependency>

java代码

  1. 替换所有的import javax.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletRequest;
  2. 替换所有的import javax.servlet.http.HttpServletResponse;import jakarta.servlet.http.HttpServletResponse;
  3. 替换所有的import javax.annotation.Resource;import jakarta.annotation.Resource;
  4. 替换所有的import javax.servlet.FilterChain;import jakarta.servlet.FilterChain;
  5. 替换所有的import javax.servlet.ServletException;import jakarta.servlet.ServletException;
  6. 替换import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import org.springframework.web.servlet.HandlerInterceptor;同时将extends HandlerInterceptorAdapter {替换成implements HandlerInterceptor {
  7. 替换所有的import javax.annotation.PostConstruct;import jakarta.annotation.PostConstruct;

starter修改

META-INF目录下增加spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports将原来spring.factories文件中的AutoConfiguration每行一个放在这个文件中

比如:

org.springframework.boot.autoconfigure.AutoConfiguration.imports内容

碰到的问题

有部分接口出现异常Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.

解决办法是修改maven-compiler-plugin的插件配置:

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <parameters>true</parameters> <!--增加-->
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
          <annotationProcessorPaths>
            <path>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <version>${lombok.version}</version>
            </path>
            <path>
              <groupId>org.mapstruct</groupId>
              <artifactId>mapstruct-processor</artifactId>
              <version>${mapstruct.version}</version>
            </path>
          </annotationProcessorPaths>
          <compilerArgs><!--增加-->
            <arg>-parameters</arg>
          </compilerArgs>
          <!--一些必备参数-->
          <basedir/>
          <buildDirectory/>
          <mainOutputDirectory/>
          <outputDirectory/>
          <projectArtifact/>
        </configuration>
      </plugin>