Maven打包后运行jar报NoClassDefFoundError,如何将依赖打入jar包
报错原因
你遇到的NoClassDefFoundError确实是依赖缺失导致的。Maven默认执行mvn clean package生成的jar包仅包含当前项目的编译产物,不会自动把项目依赖的第三方jar包整合进去,运行时JVM找不到对应依赖的类就会抛出该异常。
解决方案
推荐两种常用的打包带依赖的可执行jar的方式,二选一即可:
方式一:使用maven-assembly-plugin
这个插件支持把所有依赖和项目代码打包成一个完整的可执行jar,配置步骤如下:
- 在你的项目
pom.xml的build -> plugins节点下添加以下配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <archive> <manifest> <!-- 这里替换成你自己的主类全路径,就是包含main方法的那个类 --> <mainClass>Create_pass_criteria.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 重新执行打包命令:
mvn clean package - 打包完成后target目录下会生成文件名带
jar-with-dependencies后缀的jar包,运行这个jar即可:java -jar create_pass_criteria-1.0-SNAPSHOT-jar-with-dependencies.jar
方式二:使用maven-shade-plugin
如果你的项目有依赖冲突、需要合并资源文件的场景,推荐用这个插件,配置如下:
- 在
pom.xml的build -> plugins节点下添加配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 替换成你自己的主类全路径 --> <mainClass>Create_pass_criteria.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
- 重新执行
mvn clean package,直接运行target目录下生成的普通jar包即可,不需要带额外后缀。
注意事项
- 配置中的主类全路径不要写错,要和你实际项目里的主类路径完全一致
- 如果打包后还是提示类找不到,先检查你
pom.xml里的依赖是否已经正确添加了缺失的com.mprv.automation相关依赖,scope不要设置成provided,否则不会被打包进去。
内容的提问来源于stack exchange,提问作者Orly Orly
相关产品推荐
相关产品推荐

