Spring Boot部署Heroku报invalid target release:18编译错误
报错根因
invalid target release: 18属于Maven编译的经典版本不匹配错误:你项目配置的Java编译目标版本为JDK 18,但Heroku构建环境默认没有预装JDK 18,用低版本JDK编译高版本目标代码时直接抛出异常。
你贴出的pom片段没有显式配置Java版本,会直接继承Spring Boot父POM的默认JDK版本配置,和你本地使用的JDK 18对齐,但Heroku对非LTS版本的JDK不会做自动识别适配,最终导致构建失败。
修复步骤
优先选择长期支持版本适配,稳定性更有保障:
- 在pom.xml的
<properties>节点中显式声明使用JDK 17(Heroku原生支持、Spring Boot 3.x官方推荐的LTS版本),覆盖默认的版本配置:
- 在pom.xml的
<properties> <java.version>17</java.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <!-- 保留原有其他配置,比如vaadin版本定义 --> <vaadin.version>你当前使用的Vaadin版本号</vaadin.version> </properties>
- 在项目根目录新建
system.properties文件,明确指定Heroku构建时使用的JDK版本,避免平台自动识别出错:
- 在项目根目录新建
java.runtime.version=17
- 本地开发环境切换为JDK 17,重新执行
mvn clean package确认编译、运行无异常后,将修改提交到Git仓库并推送到Heroku即可正常完成构建部署。
- 本地开发环境切换为JDK 17,重新执行
如果你确实因为代码依赖JDK 18特性无法降级,可以直接在根目录system.properties中写入java.runtime.version=18强制Heroku拉取JDK18镜像构建,但非常不推荐在生产环境使用非LTS版本JDK,这类版本支持周期短,后续可能出现构建缓存失效、无安全补丁等问题。
补充说明:你粘贴的pom片段开头缺失<dependencies>起始标签,属于粘贴疏漏,和本次编译报错无关。
内容的提问来源于stack exchange,提问作者Ivonne R
相关产品推荐
相关产品推荐

