2017-02-25 39 views
1

我写一个简单的测试程序,以JSON转换成Java对象使用杰克逊2.“java.lang.NoClassDefFoundError:COM/fasterxml /杰克逊/数据绑定/ ObjectMapper” 使用gradle这个时候

我的代码,

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 MavenCorrect set of dependencies for using Jackson mapper没有解决问题。


编辑: 当我试图编译程序使用javac和依赖的jar文件手动,它的工作。这个问题必须在gradle构建文件中。

+0

那么,在运行jar时,你不会在类路径中添加Jackson,所以它在类路径中不可用。你为什么认为它应该是?使用应用程序插件,使其生成一个可运行的jar文件,其中包含在Class-Path清单条目中列出的所有依赖项,并使其生成包含所需所有内容(包括启动脚本)的应用程序分发。 –

+0

@JBNizet谢谢!我还发现了阴影插件来创建一个超级罐子。你能否告诉你创建一个超级jar还是创建一个zip文件比应用程序插件更好? –

+0

应用程序插件更好。一个超级罐子是一种黑客,通常人们开始使用超级罐子作为库,并想知道为什么没有按预期工作。 –

回答

1

你将需要打包你的应用程序库。

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,它被大多数开发者使用。

相关问题