运行Play:控制器/路由的Heroku错误已由Java Runtime的较新版本进行编译

问题描述

我正在尝试在Heroku上运行Play ...

完整错误为: play.api.UnexpectedException:意外的异常[RuntimeException:java.lang.UnsupportedClassversionError:控制器/路由已由Java Runtime的最新版本(类文件版本58.0)编译,此版本的Java Runtime仅识别类文件版本最高55.0](58是Java 14,55是Java 11)。

Heroku帮助说:
通过在system.properties文件中进行设置,确保使用正确的JDK版本。

我在system.proprties中添加了以下内容
java.runtime.version = 14.0.1。 而且我可以看到它被Heroku编译所使用。但是我仍然会收到错误消息。

我以为问题可能是相反的,所以我也尝试了:
java.runtime.version = 11.0.8

我还尝试将以下内容添加到application.conf java.source = 11.0.8

为了完整性,java.source = 14.0.1

当我在没有Heroku(sbt编译阶段)的情况下在本地运行时,一切都很好。

我尝试了Heroku的Play示例,也尝试了Play的Play示例(添加procfile)...结果是相同的。

Play版本为:
addSbtPlugin(“ com.typesafe.play”%“ sbt-plugin”%“ 2.8.2”) 我尝试放入一些旧版本,但Heroku无法编译。

解决方法

我回过头来尝试让Heroku版本在本地运行(而不是相反)。从产生的错误消息中,我发现通过brew安装的sbt向JDK 13添加了依赖项:
SBT fails with `String.class is broken`

我遵循此处列出的修复程序,并使用SDKMAN安装了sbt(此处的说明: https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Mac.html

这使我进入下一个错误,该错误是由于“旧的SBT版本”引起的:
java.lang.NullPointerException in project root running sbt

修复此问题后,我现在可以在Heroku和本地运行Play