You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:仅含自身代码的原始jar
  • my-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:04:51