本地能启动,但是部署到服务器上报 LinkageError 这个问题该怎么解决?

194 天前
 tiRolin

我做了一个项目,这个项目在我的本地可以正常启动和编译,但是在服务器上不行

服务器上只要一启动,就报

错误: 加载主类 org.springframework.boot.loader.launch.JarLauncher 时出现 LinkageError
        java.lang.UnsupportedClassVersionError: org/springframework/boot/loader/launch/JarLauncher has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the JavaRuntime only recognizes class file versions up to 55.0

看解决方案都是说 Java 的版本不对,可是我的 java 版本明明是对的

首先我使用的是 JDK21 ,我在 idea 中确保了一下内容是 JDK21

本地使用的 JDK 也是 21

服务器的 jdk 也是 21

感觉一点问题都没有,然而只要部署到服务器,就会报上面的问题,给我整不会了

另外下面是我的 pom 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>jar</packaging>

    <groupId>com.example.oa</groupId>
    <artifactId>example_server</artifactId>

    <properties>
        <java.version>21</java.version>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version> <!-- 根据需要选择版本 -->
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  Lombok  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我远程部署使用的命令是

sudo nohup java -jar msp_oa_server-3.4.2.jar > /home/server/msp_oa_server.log 2>&1 &

对于这个问题,我无论是问 AI 还是去搜索引擎查找,都没有找到好的解决方案,他们大多是在重复说是 java 版本不对,然而我怎么看都感觉是对的,实在没办法,来求助各位大佬了,希望有懂得能救一下

1628 次点击
所在节点    Java
8 条回复
zacharyjia
194 天前
你运行一下 sudo java -version 试试,是不是你的普通用户和 root 用户的 path 配置不一样,使用了不同的 java 版本?
sujin190
194 天前
本地和服务器子版本号差了好几个了吧,要不本地降个版本编译下试试?
zacharyjia
194 天前
@sujin190 不至于,他报错显示 class 文件版本号 61 ,应该是 target version 到 java 17 ,但是 runtime 支持的最高版本号是 55 ,对应 java 11 ,肯定是服务器上运行的时候用成了 jdk11
iminto
194 天前
代码不会说谎,就是你服务器 jdk 版本过低,再次检查吧
Allan0423
194 天前
你的服务器上,确定只有一个 java ?
lqbk
194 天前
这报错就是很明显吧,是不是有多个 java sdk 没引用到正确的 java sdk 。 先排除 java sdk 的问题吧
tiRolin
194 天前
@zacharyjia 还真是,你就是我的神,大佬
Richared
194 天前
这不很明显么,你服务器上的 java 版本低,检查检查你用的用户是不是不同的环境变量。再搞个笑,用 java8 就能避免这个问题。哈哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1113967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX