高版本的jdk在使用maven时,如何编译成低版本的class

idea项目sdk设置的jdk17

java 复制代码
private byte[] getUtf8Bytes(char c){
    char[] chars ={c};
    CharBuffer charBuffer = CharBuffer.allocate(chars.length);
    charBuffer.put(chars);
    charBuffer.flip();
    ByteBuffer byteBuffer=StandardCharsets.UTF_8.encode(charBuffer);
    return byteBuffer.arrayO);
}

在pom.xml中指定了maven.compile.source和target

xml 复制代码
 <properties>
        <revision>1.0.0-SNAPSHOT</revision>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spotless.skip>true</spotless.skip>
</properties>

通过mvn打包上传,运行报flip()方法不存在,返回值不一致。 解决方案:

java 复制代码
private byte[] getUtf8Bytes(char c){
    return Character.toString(c).getBytes(StandardCharsets.UTF_8);
}

但是,这引起了我的兴趣,明明我已经指定了source和target为8,为什么没生效

原因: 在 JDK 9 及以上版本 ,javac 的行为变了。

  • 当使用 JDK 9+(比如你现在用 JDK 11)编译时,
    -source 和 -target 已不足以限制生成的 class 版本。
  • 你还必须显式指定 --release 参数,否则 javac 会使用当前 JDK 的标准库(即 JDK 11 的 API),
    导致编译出的字节码即使版本号是 52(Java 8),但依赖了 JDK 11 的类或方法 → 实际上仍然不兼容 JDK 8。

解决方案:

xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version> <!-- 建议显式声明 -->
    <configuration>
        <encoding>UTF-8</encoding>
        <release>8</release>
        <source>8</source>
        <target>8</target>
    </configuration>
</plugin>

或者

xml 复制代码
<maven.compiler.release>8</maven.compiler.release>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>

加入source和target是为了保证在java8(没有release参数)也没问题


先说为什么一个java8的项目,开发者却设置了jdk17而且一直没出问题: 1.项目的parent引入了spotless插件,且仅支持jdk11以上的版本 2.parent项目升级了一个版本之后,引入的redisson要求jdk必须为8 这才暴露了问题。 最开始是改为project sdk = jdk8 maven runner = jdk11 但是编译之后的包还是有问题,临时禁用了spotless <spotless.skip>true</spotless.skip> 但是没有完全生效 于是加入了另一个配置

xml 复制代码
<plugin>
  <groupId>com.diffplug.spotless</groupId>
  <artifactId>spotless-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>default</id>
      <phase>none</phase>  <!-- 禁用所有执行 -->
    </execution>
  </executions>
</plugin>

这样再将project sdk 设置为jdk8 maven runner 设置为project sdk

如果要启用spotless ,maven指定release是最稳妥的办法。

相关推荐
卷无止境11 分钟前
如何让AI Agent老老实实遵守公司代码规范——以Pi Agent为例
后端·python
行者-全栈开发12 分钟前
SpringBoot 生产环境踩坑实录:10个真实故障案例与教训
java·spring boot·后端
JaguarJack18 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
后端·php·laravel·服务端
Wx-bishekaifayuan21 分钟前
springboot线上中医药养生平台管理系统36753-计算机课程设计、毕业设计
java·spring boot·后端·spring·课程设计·express·旅游
IT_陈寒24 分钟前
为什么我的Vue组件总是莫名其妙更新?
前端·人工智能·后端
Wx-bishekaifayuan25 分钟前
springboot大学生就业平台47691-计算机课程设计、毕业设计
java·spring boot·后端·elasticsearch·课程设计·express·旅游
BingoGo28 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.4.1 发布,新增 MCP 支持
后端·php
汤姆yu39 分钟前
基于springboot+vue的企业OA办公系统
java·spring boot·后端·oa办公
南归北隐44 分钟前
Spring AI Alibaba Graph框架实现RAG私有知识库问答
java·后端·spring·spring ai·java rag实现
打工仔折腾 AI1 小时前
鸿蒙版ToDesk远控实测:蓝牙键鼠、双模式鼠标与跨端剪贴板怎么用
后端·python·华为·性能优化·计算机外设·harmonyos·ai agent 实战