代码之家  ›  专栏  ›  技术社区  ›  Matt Welke

如何使云原生Buildpacks构建器能够检测我的Gradle Java项目的Java版本?

  •  0
  • Matt Welke  · 技术社区  · 2 年前

    我很难找到我尝试过的两个云原生构建包中的任何一个( gcr.io/buildpacks/builder:v1 paketobuildpacks/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来构建类文件,然后使用JDK 11来运行它们。

    我的项目结构是通过运行 gradle init 选择“应用程序”作为要创建的项目类型,除了我移动了 app 进入根目录并删除 settings.gradle .我发现我必须这么做,为了第一个建设者,我试图在第一时间将其作为Gradle项目进行检测。我还要补充一点 id 'com.github.johnrengelman.shadow' version '7.1.2' plugins 部分 build.gradle ,否则生成器生成失败,错误是无法找到主类。

    我将以下内容添加到 建筑格拉德尔 要指明我对该项目的首选Java版本,请执行以下操作:

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

    我认为这可能是我做错了什么,因此这是发布到堆栈溢出的一个很好的理由,而不是在我尝试的两个构建器的任何一个回购协议中提出GitHub问题,因为我在两个构建器中都遇到了完全相同的错误(一个来自谷歌,另一个来自Paketo)。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Daniel Mikusa    2 年前

    我无法与第一个构建者交谈,但对于Paketo BuildPack,您只需设置 BP_JVM_VERSION 这将告诉建设者使用什么版本。默认情况下,它将使用Java11,所以我认为这就是为什么要使用Java11。

    前任: 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和Java 17上本地构建时 pack build -p build/libs/app.jar ,忘记设定 BP_JVM_版本 17 .在这种情况下,它将根据我的本地编译代码构建,该代码来自较新的Java版本。

    如果你不打电话 -p 争论或拥有 -p 指向您的Java源代码,那么您应该在构建和运行时始终获得与相同版本的Java一致的构建。