如何启用 Cloud Native Buildpacks 构建器来检测我的 Gradle Java 项目的 Java 版本?

How do I enable a Cloud Native Buildpacks builder to detect my Gradle Java project's Java version?

我无法让我尝试过的两个 Cloud Native Buildpacks 构建器(gcr.io/buildpacks/builder:v1paketobuildpacks/builder:base)完全检测到我想要的 Java 版本,因此正确的 JVM 用于构建我的项目并 运行 它。它似乎在完成构建步骤时成功检测到我想要的版本,但我在构建期间的日志中注意到它最终下载了版本 11 JDK 并且在尝试 运行 时出现错误来自构建镜像的容器:

Error: LinkageError occurred while loading main class com.mattwelke.javatests.JavalinPostgresJdbc
java.lang.UnsupportedClassVersionError: com/mattwelke/javatests/JavalinPostgresJdbc has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

此错误表明它选择使用 JDK 17 来构建 class 文件,然后 JDK 11 到 运行 它们。

我的项目结构是运行ning gradle init制作的,选择“application”作为要创建的项目类型,除了我把app的内容上移了进入根目录并删除 settings.gradle。我发现我必须这样做才能让我尝试首先将其检测为 Gradle 项目的第一个构建器。我还必须将 id 'com.github.johnrengelman.shadow' version '7.1.2' 添加到 build.gradleplugins 部分,否则构建器无法构建,并出现无法找到主 class 的错误。

我将以下内容添加到 build.gradle 以表明我的项目首选 Java 版本:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

我认为这可能是我做错了什么,因此这是 post 到 Stack Overflow 的一个很好的理由,而不是在任何一个回购协议中提出 GitHub 问题我尝试了两个构建器,因为两个构建器都出现了完全相同的错误(来自 Google 的一个和来自 Paketo 的一个)。

我无法与第一个构建器对话,但对于 Paketo Buildpacks,您只需设置 BP_JVM_VERSION 即可告诉构建器要使用的版本。默认情况下它会使用 Java 11,所以我认为这就是你得到 Java 11.

的原因

例如:pack build cool-app -e BP_JVM_VERSION=17

https://paketo.io/docs/howto/java/#install-a-specific-jvm-version

有个Gradle Sample App available here.


我不知道为什么有些东西是用 Java 17 构建的,但是对于 Paketo Java buildpack,你不能用一个版本构建而 运行 用另一个版本构建, 相同的版本始终用于构建和 运行.

我唯一一次看到这种情况发生在我在 Java 17 和 pack build -p build/libs/app.jar 上进行本地构建时,忘记将 BP_JVM_VERSION 设置为 17。在那种情况下,它将根据我本地编译的代码构建,该代码来自较新的 Java 版本。

如果您不使用 -p 参数或让 -p 指向您的 Java 源代码,那么您应该始终使用相同版本的 [=34] 获得一致的构建=] 在构建和 运行 时间。