Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在使用gradle的子项目中使用jackson库依赖项时会丢失?_Java_Gradle_Jackson_Multi Module - Fatal编程技术网

Java 为什么在使用gradle的子项目中使用jackson库依赖项时会丢失?

Java 为什么在使用gradle的子项目中使用jackson库依赖项时会丢失?,java,gradle,jackson,multi-module,Java,Gradle,Jackson,Multi Module,我有一个gradle项目p,其中有模块a和模块B。模块a有此jackson依赖项: ... dependencies { ... compile 'com.fasterxml.jackson.core:jackson-core:2.12.0-rc1' compile 'com.fasterxml.jackson.core:jackson-annotations:2.12.0-rc1' compile 'com.fasterxml.jackson.core:jack

我有一个gradle项目p,其中有模块a和模块B。模块a有此
jackson
依赖项:

...
dependencies {
    ...
    compile 'com.fasterxml.jackson.core:jackson-core:2.12.0-rc1'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.12.0-rc1'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.12.0-rc1'
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.12.0-rc1'
    ...
}
...
模块B使用模块A,并且不需要包含此依赖项,因为
jackson
用法封装在模块A中。但是,当从模块B执行的代码到达一条语句,该语句使用模块A调用代码时,我得到异常:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/dataformat/xml/XmlMapper
如果我将相同的依赖项添加到模块的B
gradle.build
文件中,代码就会正常工作。 问题是,如果模块A不使用库,为什么我要包括它们?
模块A中的依赖项不应该被编译、打包,这样当模块A在其他地方使用时,它的代码就可以工作了(使用它包含的依赖项,如本例中的
jackson
library)

免责声明:我不知道Gradle,但这听起来像是Maven和Gradle常见的问题

您可以构建模块,但不能运行模块,这意味着在某些地方您没有将可传递的依赖项引入Spring Boot fat jar。Jackson在元数据文件、类加载器等方面没有做任何奇怪的事情。它在胖罐子中与其他人玩得很好

考虑到您没有共享太多的构建文件,要确定是否有什么东西排除了Jackson XML模块,最简单的方法就是运行
jar-xvf target/app.jar
并检查输出是否在那里


如果不是,那么寻找一个与Maven dependency插件的dependency tree目标相当的Gradle,它将向您显示整个可传递的dependency tree。如果它被排除在外,您肯定会看到它从依赖项转储中丢失。

您的应用程序是打包为war/ear工件并部署在一个容器上,还是它只是一个带有main的普通java jar?它只是一个没有main类的普通java。假设模块A是来自项目P的api代码,模块B是作为依赖项的核心。没有计划在整个项目P之外交付模块A。项目P被捆绑为java(实际上是javafx,使用spring boot)应用程序,打包为jar。您的意思是您从
模块B
执行一些代码?如果moduleB有一个专用的
build.gradle
,那么这些依赖项当然不会存在。您可以为这两个模块创建一个通用的
build.gradle
,并通过
子项目包含所有需要的依赖项
…为包含jackson依赖项的模块创建的jar只包含我的生产代码,不包含任何其他内容,也不包含依赖项中的类。这突出了我可能需要以某种方式构建一个
fatJar
,我认为。