You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4B部署Piano-Player遇java.lang.NoClassDefFoundError错误求助

问题描述
  • 运行环境:树莓派4B,Raspbian Lite x64
  • 部署目标:某Java Web应用
  • 构建状态:执行mvn clean package可成功完成
  • 启动命令:
    java \
        -Xms4m \
        -Xmx64m \
        -Dlog4j.configuration=file:/conf/log4j.xml \
        -jar target/piano-player-1.0.11-SNAPSHOT.jar \
        /conf/piano-player.yml
    
  • 启动报错:java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/ThreadPool
  • 当前环境版本:
    openjdk version "17.0.9"
    Node v16.0.0
    Maven home: /opt/apache-maven-3.5.0
    
  • 尝试操作:手动将pom.xml中jetty-util依赖版本改为9.3.14.v20161028,导致构建出现大量module not found错误
  • 补充(依赖树翻译后核心信息):项目存在Jetty组件版本冲突,直接依赖的jetty-util版本与jetty-server等其他Jetty组件依赖的版本不一致,同时第三方库也间接引入了不同版本的Jetty模块。
解决思路与方案

1. 确认可执行jar是否包含依赖

启动时的类找不到错误,大概率是打包出来的jar没把Jetty等依赖库包含进去。执行以下命令检查jar内的内容:

jar tf target/piano-player-1.0.11-SNAPSHOT.jar | grep jetty

如果输出为空或没有Jetty相关的class文件,说明打包遗漏了依赖。需要修改pom.xml,用maven-shade-plugin把所有依赖打进可执行jar:

配置maven-shade-plugin示例

在pom.xml的<build><plugins>节点下添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <!-- 替换成你项目的主类全路径 -->
                        <mainClass>com.yourpackage.MainClass</mainClass>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

重新执行mvn clean package,再启动jar试试。

2. 统一Jetty版本消除冲突

单独修改jetty-util版本导致构建错误,是因为项目中其他Jetty组件(如jetty-server、jetty-webapp)的版本和你改的版本不兼容。解决方法:

  • 在pom.xml中添加<dependencyManagement>节点,统一管理所有Jetty组件的版本:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-bom</artifactId>
            <!-- 替换成项目原本依赖的Jetty统一版本,可从mvn dependency:tree输出中查找 -->
            <version>9.4.44.v20210927</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 执行mvn dependency:tree > dependency-tree.txt,查看完整依赖树,确保所有Jetty相关依赖的版本一致,彻底消除版本冲突。

3. 调整JDK版本适配Jetty

OpenJDK 17对旧版本Jetty(如9.x系列)的支持有限,如果项目依赖的Jetty版本较低,可以:

  • 降级JDK到OpenJDK 11(LTS版本,对旧库兼容性更好)
  • 或者升级Jetty到支持Java 17的版本(如Jetty 11.x或12.x),但要确保项目代码能兼容新版本Jetty的API。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:46:00