UberJar运行异常:IntelliJ Maven项目Jackson YAML报NoClassDefFoundError
解决Java运行时
NoClassDefFoundError:Jackson YAMLFactory依赖未打包问题 我来帮你搞定这个问题!你碰到的NoClassDefFoundError根本原因是Maven没有真正把Jackson YAML的依赖打包进可执行JAR——看你的pom.xml,问题出在所有打包插件都放在了<pluginManagement>节点里,这个节点只是用来统一管理插件的版本和配置模板,并不会实际触发插件执行。
下面给你两个可行的解决方案,选一个就行:
方案1:用maven-shade-plugin(推荐,打包更灵活)
把shade插件从<pluginManagement>移到<build>下的<plugins>节点中,这样Maven才会在打包阶段执行它。修改后的pom.xml构建部分如下:
<build> <plugins> <!-- Java 1.8编译配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- Shade插件:打包所有依赖到可执行JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 配置主类,让JAR可直接运行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
操作步骤:
- 执行命令:
mvn clean package - 去项目的
target目录,找到App-1.0-SNAPSHOT.jar(这是Shade打包好的包含所有依赖的可执行JAR) - 运行JAR:
java -jar App-1.0-SNAPSHOT.jar
方案2:用maven-assembly-plugin
同样,把assembly插件移到<build><plugins>下,并且补充主类配置(原来的配置里没给assembly指定主类,这也是个小问题):
<build> <plugins> <!-- Java 1.8编译配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!-- Assembly插件:生成带依赖的JAR --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- 配置主类,让JAR可直接运行 --> <archive> <manifest> <mainClass>App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
操作步骤:
- 执行命令:
mvn clean package - 去
target目录找App-1.0-SNAPSHOT-jar-with-dependencies.jar - 运行JAR:
java -jar App-1.0-SNAPSHOT-jar-with-dependencies.jar
关键提醒
- 不要同时启用Shade和Assembly两个打包插件,选一个就好,避免生成多个JAR混淆
<pluginManagement>节点适合多模块项目统一管理插件配置,但单模块项目要执行的插件必须放到<build><plugins>下才会生效
内容的提问来源于stack exchange,提问作者Rax Wunter
相关产品推荐
相关产品推荐

