Java 为什么在使用gradle的子项目中使用jackson库依赖项时会丢失?
我有一个gradle项目p,其中有模块a和模块B。模块a有此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
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
如果我将相同的依赖项添加到模块的Bgradle.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
,我认为。