Java 找不到杰克逊 jar 文件

Java can't find jackson jar file

我需要使用 jackson 来处理我代码中的一些 JSON。我写了一个简单的测试 class 让它工作。

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public static void main(String[] args) { 
        ObjectMapper objectMapper = new ObjectMapper();
    }
}

我把 jackson-databind-2.9.9.1.jar 放在了 /dirwherejarresides/jdk/jre/lib/ext.

我能够毫无问题地编译 class,并生成 Test.class

javac Test.java

但是,我似乎无法 java 找到 jar 并执行 class。

java -cp "/dirwhereclassresides/java" Test                                       Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonView
        at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.<clinit>(JacksonAnnotationIntrospector.java:37)
        at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:291)
        at Test.main(Test.java:5)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonView
        at java.net.URLClassLoader.run(URLClassLoader.java:366)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more

我尝试添加 jar 所在的路径,但我得到了同样的错误。

java -cp "/dirwhereclassresides/java:/dirwherejarresides/jdk/jre/lib/ext/jackson-databind-2.9.9.1.jar" Test
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonView
        at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.<clinit>(JacksonAnnotationIntrospector.java:37)
        at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:291)
        at Test.main(Test.java:5)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonView
        at java.net.URLClassLoader.run(URLClassLoader.java:366)
        at java.net.URLClassLoader.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 3 more

我需要做什么才能java看到罐子?

通常 ClassNotFoundException 是您拥有两个具有不同版本的相同包的副作用。打印出一个依赖树,看到没有加载同一个依赖的两个版本。

Jackson 库被分成几个 jar 模块,它们声明彼此之间的依赖关系。例如:jackson-databind 依赖于 jackson-annotationsjackson-core.

jackson-databind-*.jar 实际上不包含您得到异常的 JsonView 注释的 class。它位于 jackson-annotations-*.jar 文件中。但是为了能够用 Jackson 解析 JSON,你肯定还需要 jackson-core-*.jar

顺便说一句,你传递 class 路径的第二种方法更正确,你需要在 -cp 参数中列出你的 class 依赖的所有 jar 文件,用冒号分隔在 Unix/Linux 系统上。例如

$ java -cp ".:/pathtojackson/jackson-databind-2.9.9.1.jar:/pathtojackson/jackson-core-2.9.9.jar:/pathtojackson/jackson-annotations-2.9.9.jar" Test

您也可以在 -cp 参数中使用星号表达式,参见

它正在抱怨 annotation/JsonView,似乎它找到了 jackson data-bind。因为你没有使用 Maven,我怀疑 jackson-core 是数据绑定的传递依赖,没有被注入。

尝试将 jackson-core 添加到您的类路径中。