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-annotations
和 jackson-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
添加到您的类路径中。
我需要使用 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-annotations
和 jackson-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
添加到您的类路径中。