我正在编写一个简单的测试程序,使用jackson 2将json转换为java对象。
我的代码是,
package test;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URL;
public class UseJson{
public static void main(String[] args){
ObjectMapper mapper = new ObjectMapper();
try{
SomeClass obj = mapper.readValue(new URL("http://someurl"), SomeClass.class);
}
catch(Exception ex){
System.out.println(ex.toString());
}
}
}
build.gradle文件是
repositories {
mavenCentral()
}
apply plugin: 'java'
dependencies{
compile('com.fasterxml.jackson.core:jackson-databind:2.8.6')
compile('com.fasterxml.jackson.core:jackson-core:2.8.6')
compile('com.fasterxml.jackson.core:jackson-annotations:2.8.6')
}
jar {
manifest {
attributes 'Main-Class': 'test.UseJson'
}
}
但是我在尝试执行程序时遇到异常
java -jar ./build/libs/JsonTest.jar
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
at test.UseJson.main(UseJson.java:10)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
相关帖子java.lang.ClassNotFoundException / NoClassDefFoundError for com/fasterxml/jackson/databind/ObjectMapper with Maven和Correct set of dependencies for using Jackson mapper无法解决问题。
编辑: 当我尝试使用javac和依赖项的jar文件手动编译程序时,它工作正常。问题必须与gradle构建文件有关。
答案 0 :(得分:2)
您需要使用应用程序打包库。
jar {
archiveName = 'Name.jar'
manifest {
attributes 'Main-Class': 'Main',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
'Implementation-Version': project.version (if any)
}
from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) })
}
其他解决方案是使用Shadow jar插件。
最推荐的解决方案是使用application插件。为什么?它是支持的,它是Gradle,它被大多数开发人员使用。