Maven项目运行生成Jar报NoClassDefFoundError但类存在代码可正常执行
问题根因
Maven默认maven-jar-plugin打出来的包只包含项目自身的编译代码,不会把aspose-cells这类第三方依赖打进包内,也不会自动配置依赖的查找路径。
IntelliJ IDEA运行项目时会自动把所有Maven依赖加入运行时类路径,所以本地IDE测试完全正常。直接执行Maven生成的普通Jar包时,JVM找不到包外的aspose相关类,就会抛出NoClassDefFoundError。
你看到前3行日志正常输出、甚至输出文件生成成功,是因为代码执行到第44行首次调用SaveOptions相关逻辑时才会触发这个类的加载,这时候才抛出类找不到的错误,之前没用到该类的逻辑可以正常运行。
解决方法
配置Maven插件打包含所有依赖的可执行胖包即可,往pom.xml的<build><plugins>节点下加入如下配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <!-- 替换为你自己的主类全限定名,对应报错信息中的src.main.java.MainClass --> <mainClass>src.main.java.MainClass</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包,直接运行这个包就不会出现类找不到的错误。
如果对包结构有要求,也可以替换为maven-shade-plugin实现胖包打包,效果一致。
内容的提问来源于stack exchange,提问作者Tvrsier
相关产品推荐
相关产品推荐

