【问题标题】:"java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper" when using gradle使用 gradle 时出现“java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper”
【发布时间】:2017-02-25 05:28:51
【问题描述】:

我正在编写一个简单的测试程序,使用 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 MavenCorrect set of dependencies for using Jackson mapper 并没有解决问题。


编辑: 当我尝试使用 javac 和依赖项的 jar 文件手动编译程序时,它起作用了。问题一定出在 gradle 构建文件上。

【问题讨论】:

  • 好吧,你没有在运行你的 jar 时将 Jackson 添加到类路径中,所以它在类路径中不可用。为什么你认为它应该是?使用应用程序插件,使其生成一个可运行的 jar 文件,其所有依赖项都列在 Class-Path 清单条目中,并使其生成包含所需一切的应用程序分发,包括启动脚本。
  • @JBNizet 谢谢!我还找到了创建 uber jar 的 shadow 插件。你能说是创建一个 uber jar 还是像在应用程序插件中创建一个 zip 文件更好吗?
  • 应用插件更好。 uber-jar 是一种 hack,而且通常人们开始使用 uber jar 作为库,并且想知道为什么没有按预期工作。
  • @JBNizet 好的,谢谢!
  • @InjuredThePatient 看来我忘记接受答案了。

标签: java json gradle jackson


【解决方案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,被大多数开发者使用。

【讨论】:

  • 对我有用的唯一方法是使用 Shadow jar 插件...我想知道,如何正确配置应用程序插件...
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2022-09-20
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多