使用Maven Shade Plugin构建Fat Jar时遭遇NoClassDefFoundError异常
问题分析与解决方案
你的报错核心原因是Maven Shade插件的配置存在两处关键错误,导致依赖未被正确打包进Fat Jar:
- commons-cli的groupId匹配错误:你pom中依赖的commons-cli groupId是
commons-cli,但Shade配置里写的是org.apache.commons:commons-cli,这个匹配规则找不到对应的依赖,所以该类库没被打包。 - 依赖打包范围不全:当前只配置了包含commons-lang3和commons-cli,但项目还依赖derby、guava以及本地的studentdb,这些都需要加入打包范围;另外system scope的依赖默认不会被Shade插件处理,需要显式配置。
修改后的Maven Shade插件配置
替换你pom中原来的shade插件部分:
<!-- Maven Shade Plugin --> <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> <!-- 包含所有需要的依赖 --> <artifactSet> <includes> <include>commons-cli:commons-cli</include> <include>org.apache.derby:derby</include> <include>com.google.guava:guava</include> <include>nz.ac.wgtn.swen301:studentdb</include> </includes> </artifactSet> <!-- 允许打包system scope的本地依赖 --> <includeSystemScope>true</includeSystemScope> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>nz.ac.wgtn.swen301.assignment1.cli.StudentManagerUI</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
关键修改说明
- 修正了commons-cli的groupId匹配规则,确保能正确识别并打包该依赖。
- 补充了项目运行必需的derby、guava、studentdb依赖的打包规则。
- 新增
<includeSystemScope>true</includeSystemScope>,让Shade插件处理本地的system scope依赖。 - 若想简化配置,可直接删除
<artifactSet>节点,默认会自动打包所有compile/runtime scope的依赖(test scope除外)。
验证步骤
- 清理旧构建产物:
mvn clean
- 重新构建打包:
mvn package
- 运行生成的Fat Jar(默认位于
target目录,名称为assignment1-1.0.0.jar):
java -jar target/assignment1-1.0.0.jar
内容的提问来源于stack exchange,提问作者MagicKoyFish
相关产品推荐
相关产品推荐

