树莓派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
相关产品推荐
相关产品推荐

