我需要使用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看到罐子?
答案 0 :(得分:1)
Jackson库分为几个jar模块,这些模块声明了彼此之间的依赖关系。例如:jackson-databind
取决于jackson-annotations
和jackson-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是使两个相同软件包具有不同版本的副作用。打印出一个依赖关系树,查看没有加载相同依赖关系的两个版本。