Maven集成jackson-databind后运行出现类找不到异常求助
问题描述
我有一个极简Maven项目,使用fasterxml/jackson-databind依赖,项目代码如下:
package com.mycompany.app; import com.fasterxml.jackson.databind.ObjectMapper; class MyValue { public String name; public int age; } public class App { public static void main( String[] args ) { try { // ObjectMapper mapper = new ObjectMapper(); // MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class); System.out.println( "Hello" ); } catch (Exception e) {} } }
未添加jackson-databind依赖时,编译运行正常:
$ mvn package $ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App Hello
添加依赖到pom.xml后,相关JAR包已下载,但取消注释使用jackson-databind时,出现运行时错误:
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper at com.mycompany.app.App.main(App.java:10) Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
完整pom.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <name>my-app</name> <properties> <maven.compiler.release>11</maven.compiler.release> <jackson.version>2.13.0</jackson.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> </plugins> </pluginManagement> </build> </project>
解决办法
核心原因是:Maven默认mvn package生成的jar只包含你的业务代码,不会打包依赖的第三方jar,运行时JVM找不到这些类。下面是三种实用解决方式:
方式1:打可执行胖包**(推荐)**
用maven-shade-plugin把所有依赖打包到一个jar里,直接就能运行。修改pom.xml的<build>部分,添加shade插件:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> <!-- 添加shade插件 --> <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>com.mycompany.app.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
执行mvn package后,target目录会生成两个jar:
my-app-1.0-SNAPSHOT.jar:仅含自身代码的原始jarmy-app-1.0-SNAPSHOT-shaded.jar:包含所有依赖的胖包
直接运行胖包:
java -jar target/my-app-1.0-SNAPSHOT-shaded.jar
方式2:手动指定类路径
用maven-dependency-plugin把依赖复制到本地目录,运行时指定完整类路径。修改pom.xml的<build>部分:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> <!-- 添加dependency插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
执行mvn package后,target/lib目录会出现所有依赖jar,然后按系统类型执行命令:
# Windows系统 java -cp target/my-app-1.0-SNAPSHOT.jar;target/lib/* com.mycompany.app.App # Linux/macOS系统 java -cp target/my-app-1.0-SNAPSHOT.jar:target/lib/* com.mycompany.app.App
方式3:用Maven插件直接运行
不需要处理类路径,用exec-maven-plugin直接运行程序。修改pom.xml的<build>部分:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> <!-- 添加exec插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>com.mycompany.app.App</mainClass> </configuration> </plugin> </plugins> </pluginManagement> </build>
执行命令直接运行:
mvn exec:java
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

