Java找不到杰克逊罐子文件

时间:2019-07-31 22:19:14

标签: java jar jackson classpath

我需要使用jackson在我的代码中处理一些JSON。我编写了一个简单的测试类来使其正常工作。

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中。

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

javac Test.java

但是,我似乎无法让Java找到jar并执行该类。

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$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.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$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.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看到罐子?

3 个答案:

答案 0 :(得分:1)

Jackson库分为几个jar模块,这些模块声明了彼此之间的依赖关系。例如:jackson-databind取决于jackson-annotationsjackson-core

jackson-databind-*.jar实际上并不包含您所例外的JsonView注释的类。它放置在jackson-annotations-*.jar文件中。但是要能够用Jackson解析JSON,您肯定也需要jackson-core-*.jar

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

$ 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参数中使用星号表达式,请参见https://stackoverflow.com/a/219801/2288384

答案 1 :(得分:1)

它在抱怨annotation/JsonView,似乎发现了jackson data-bind。由于您没有使用Maven,我怀疑没有注入jackson-core,它是数据绑定的传递依赖项。

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

答案 2 :(得分:0)

通常,ClassNotFoundException是使两个相同软件包具有不同版本的副作用。打印出一个依赖关系树,查看没有加载相同依赖关系的两个版本。