Apache Maven 3.8.6(JDK-19+Gson2.10)出现NoClassDefFoundError求助
问题原因
NoClassDefFoundError 是因为你通过 java -jar 运行的jar包不包含Gson依赖类,Maven默认的jar打包插件只会打包你自己项目的代码,不会将第三方依赖(比如Gson)打包进去,导致运行时找不到Gson的类。
解决方案
下面提供两种可靠的Maven打包方式,帮你把依赖一起打包进可执行jar:
方式1:使用Maven Assembly插件
- 在你的
pom.xml中添加Assembly插件配置,放在<build><plugins>节点下:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!-- 替换成你包含main方法的类的全路径,比如com.example.GSONExample --> <mainClass>你的主类全路径</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
- 执行打包命令:
mvn -f my-app\pom.xml clean package
- 打包完成后,在
my-app\target目录下会生成一个名为my-app-1.0-jar-with-dependencies.jar的文件,运行它:
java -jar my-app-1.0-jar-with-dependencies.jar
方式2:使用Maven Shade插件
- 在
pom.xml中添加Shade插件配置,放在<build><plugins>节点下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 同样替换成你的主类全路径 --> <mainClass>你的主类全路径</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
- 执行打包命令:
mvn -f my-app\pom.xml clean package
- 直接运行target目录下的
my-app-1.0.jar即可,这个jar已经包含了所有依赖:
java -jar my-app-1.0.jar
额外检查
确认你的pom.xml中Gson依赖的scope是默认的compile(不需要手动指定,默认就是compile),不要设为provided或test,否则打包时会排除这个依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10</version> <!-- 不要加<scope>provided</scope>或<scope>test</scope> --> </dependency>
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

