繁体   English   中英

如何启用 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 来运行它们。

我的项目结构是通过运行gradle init并选择“应用程序”作为要创建的项目类型而生成的,除了我将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)
    }
}

我认为这可能是我做错了什么,因此这是发布到 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 示例应用程序


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM