如何解决Java.lang.NoClassDefFoundError?Maven打包Jar运行失败求助
问题解决:Maven打包Jar运行时NoClassDefFoundError
问题根源
你配置的maven-jar-plugin并不支持jar-with-dependencies这个描述符,这个参数是maven-assembly-plugin的专属配置。单独使用maven-jar-plugin打包出来的Jar仅包含你的业务代码,不会将依赖的mfl-core类打包进去,运行时自然找不到us.hebi.matlab.mat.types.MatFile类。
解决方案
方案1:使用maven-assembly-plugin打包含所有依赖的可执行Jar(推荐)
替换你当前的maven-jar-plugin配置,改用maven-assembly-plugin生成包含所有依赖的"胖包":
<build> <plugins> <!-- 移除原有的maven-jar-plugin配置,替换为以下内容 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <archive> <manifest> <!-- 替换为你的实际主类全限定名 --> <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> </plugins> </build>
执行打包命令:mvn clean package,打包完成后,target目录下会生成两个Jar文件,其中带-jar-with-dependencies后缀的就是包含所有依赖的可执行Jar,运行它:
java -jar target/你的项目名-版本号-jar-with-dependencies.jar
方案2:保留maven-jar-plugin,通过Manifest指定依赖路径
如果不想打胖包,可以配置maven-jar-plugin的Manifest,添加依赖Jar的路径,确保运行时依赖Jar和你的主Jar在同一目录:
<plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>你的主类路径</mainClass> <!-- 自动添加依赖到Class-Path --> <addClasspath>true</addClasspath> <!-- 依赖Jar的存放位置,这里假设和主Jar同目录 --> <classpathPrefix>.</classpathPrefix> </manifest> </archive> </configuration> </plugin> <!-- 复制依赖到主Jar所在目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </execution> </executions> </plugin>
执行mvn clean package后,target目录下会有你的主Jar和所有依赖Jar,直接运行主Jar即可:
java -jar target/你的项目名-版本号.jar
内容的提问来源于stack exchange,提问作者Panda
相关产品推荐
相关产品推荐

