我正在开发一个使用 Java 等语言和 Bazel 的项目。我遇到了一堆依赖冲突,想屏蔽一个 jar。Bazel 没有办法做到这一点,所以我使用了 Gradle,这是我以前从未使用过的。使用 chatGPT 时,这是我目前拥有的脚本:
plugins {
id("java")
id("com.github.johnrengelman.shadow") version "8.1.1"
}
repositories {
mavenCentral()
maven {
url = uri("https://mvnrepository.com/artifact")
}
}
dependencies {
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.0'
}
tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
relocate 'com.fasterxml.jackson', 'shaded.com.fasterxml.jackson'
}
Gradle 是版本 8.10.2。我收到的错误如下:
java.lang.IllegalArgumentException: Unsupported class file major version 65
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:199)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:180)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:166)
at org.objectweb.asm.ClassReader.<init>(ClassReader.java:287)
在 Google 和 ChatGPT 之间,我尝试了很多方法,但都没有什么效果,而 ChatGPT 也开始给出与已经尝试过的方法相同的建议。
编辑:为了进一步澄清解决方案,我切换到了 openjdk 21,然后切换了插件,com.gradleup.shadow
该插件似乎是我一直在使用的死 repo 的后继者。
该错误与 Gradle 无关。已编译的代码已使用 Java 21 编译,但尝试使用/运行已编译的代码使用的是较早版本的 Java。因此出现不支持的类文件主版本错误。
您可以在此处查看 Java 版本及其类文件版本的列表:https ://javaalmanac.io/bytecode/versions/
您需要确保在编译/运行代码时,Gradle 构建和 Bazel 构建使用相同版本的 Java。对于 Gradle,可以使用JVM 项目的工具链来实现这一点。
一般的
看来你的 gradle 版本使用了无法处理 Java 21 字节码的 Java 编译器——可能是由 Bazel 编译的。
检查 gradle 使用的 Java 版本
如果您使用 gradle 包装器(这是推荐的方式 - 请参阅https://docs.gradle.org/current/userguide/gradle_wrapper.html)
你可以通过以下方式检查
从命令行。
如果您使用系统安装的 gradle 版本,命令将是:
在两种情况下你都会得到如下输出:
在上面的例子中,您看到 gradle 使用 Java 17。
在 gradle 中更改 Java JDK 版本
要更改这一点,您可以在内部进行设置
build.gradle
- 请参阅 如何告诉 Gradle 使用特定的 JDK 版本?或者您在操作系统上安装 JDK >= Java 21(这必须是操作系统默认设置)。
然后通过 再次检查使用的 Java 版本
./gradlew --version
。当输出显示 Java 21 版本时,您的构建现在应该可以正常工作了。