You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin项目引入Java9/10 Maven依赖遇版本错误,能否用高JDK运行?

问题解答:Kotlin项目引入Java9+编译的Maven依赖

首先直接给结论:完全可以通过使用更高版本的JDK来解决这个java.lang.UnsupportedClassVersionError错误,核心思路是让项目的运行环境用Java9+的JVM,同时保持Kotlin的编译目标为Java8——因为Kotlin编译出的Java8字节码可以在更高版本的JVM上完美运行,而高版本JVM也能兼容执行Java9+编译的类文件。

错误原因拆解

你遇到的这个错误本质是JVM的版本不兼容:当你用Java8的JVM去加载由Java9+编译的类时,JVM会因为类文件的版本号(比如Java10是54.0,Java8是52.0)高于自身支持的最高版本而拒绝加载,就抛出了这个错误。

具体解决方案

1. 切换运行环境到Java9+的JDK

首先确保你的开发环境和项目运行环境都使用Java9及以上版本的JDK(推荐用Java11这类LTS版本,稳定性更好),把JAVA_HOME环境变量指向这个高版本JDK。

2. 调整Maven配置,确保Kotlin编译目标仍为Java8

你需要在Maven的pom.xml里配置两个关键插件,保证Kotlin代码编译出Java8兼容的字节码,同时让编译过程使用高版本JDK的工具链:

配置Kotlin Maven插件

指定jvmTarget为1.8,确保Kotlin代码编译后是Java8的字节码:

<plugin>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-maven-plugin</artifactId>
    <version>1.9.20</version> <!-- 建议使用最新稳定版 -->
    <executions>
        <execution>
            <id>compile</id>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <jvmTarget>1.8</jvmTarget>
            </configuration>
        </execution>
        <execution>
            <id>test-compile</id>
            <goals>
                <goal>test-compile</goal>
            </goals>
            <configuration>
                <jvmTarget>1.8</jvmTarget>
            </configuration>
        </execution>
    </executions>
</plugin>

配置Maven编译器插件

设置编译的source/target/release为8,同时指定使用高版本JDK的javac工具:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>8</source>
        <target>8</target>
        <release>8</release> <!-- 确保生成Java8兼容的字节码 -->
        <fork>true</fork> <!-- 启用独立编译进程,使用指定的JDK -->
        <executable>${java.home}/bin/javac</executable> <!-- 指向高版本JDK的javac -->
    </configuration>
</plugin>

3. 额外处理:如果依赖用到了Java9+的API

如果你的依赖JAR里用到了Java9及以上才有的API(比如模块化特性、Java11的HttpClient等),你需要在编译器配置里添加模块依赖,避免编译时出现找不到API的错误。比如用到java.net.http模块的话,可以这样配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <!-- 其他配置 -->
    <configuration>
        <!-- 原有配置 -->
        <compilerArgs>
            <arg>--add-modules</arg>
            <arg>java.net.http</arg>
        </compilerArgs>
    </configuration>
</plugin>

验证步骤

  1. 确认java -version输出的是Java9+的版本;
  2. 执行mvn clean install重新编译项目;
  3. 运行项目,检查UnsupportedClassVersionError是否消失。

内容的提问来源于stack exchange,提问作者Johannes

火山引擎 最新活动