Maven构建独立JAR时引入commons-codec遇类缺失问题求助
问题分析与解决方案
问题原因
出现java.lang.NoClassDefFoundError的核心原因是maven-assembly-plugin的配置未正确触发依赖打包逻辑,或者依赖的scope设置导致依赖未被纳入打包范围。
解决步骤
1. 确认依赖的Scope配置
检查pom.xml中commons-codec的依赖配置,确保scope为默认的compile(无需显式声明,默认即生效),避免设置为provided或test(这两类scope的依赖不会被打包进最终JAR):
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> <!-- 使用最新稳定版 --> <!-- 无需指定scope,默认compile --> </dependency>
2. 修正maven-assembly-plugin配置
确保插件配置绑定到Maven的package生命周期,明确指定jar-with-dependencies描述符,同时配置主类入口:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <!-- 使用最新稳定版 --> <configuration> <!-- 指定包含所有依赖的打包描述符 --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 配置CLI工具的主类,替换为你的实际主类路径 --> <archive> <manifest> <mainClass>com.mycompany.app.App</mainClass> </manifest> </archive> </configuration> <!-- 绑定到package生命周期,执行install时自动打包 --> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3. 重新打包并运行
执行以下命令完成打包:
mvn clean install
打包完成后,target目录下会生成两个JAR文件:
my-app-1.0-SNAPSHOT.jar:仅包含自身代码的JARmy-app-1.0-SNAPSHOT-jar-with-dependencies.jar:包含所有依赖的可执行JAR
运行这个包含依赖的JAR即可:
java -jar ./target/my-app-1.0-SNAPSHOT-jar-with-dependencies.jar {INPUT}
常见错误排查
- 如果仍未生效,检查
mvn clean install的日志,确认assembly插件是否执行了single目标 - 打开最终生成的JAR文件,检查是否包含
org/apache/commons/codec/digest/MurmurHash3.class文件,验证依赖是否被正确打包
内容的提问来源于stack exchange,提问作者sdgaw erzswer
相关产品推荐
相关产品推荐

