【问题标题】:Why are jackson library dependencies missing when used in sub project using gradle?为什么在使用 gradle 的子项目中使用杰克逊库依赖项?
【发布时间】:2020-11-03 20:37:55
【问题描述】:

我有一个 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 库)

【问题讨论】:

  • 您的应用程序是打包为 war/ear 工件并部署在容器上,还是只是一个带有 main 的普通 java jar?
  • 它只是没有主类的纯 java。假设模块 A 是来自项目 P 的 api 代码,模块 B 是核心,将其作为依赖项。没有计划在整个项目P之外交付Module A。项目P被捆绑为java(实际上是javafx,使用spring boot)应用程序打包为jar。
  • 你的意思是你从module B执行一些代码?如果 moduleB 有一个专用的build.gradle,那么这些依赖项当然不会存在。您可以为这两个模块创建一个通用的build.gradle,并通过subprojects 包含所有需要的依赖项...

标签: java gradle jackson multi-module


【解决方案1】:

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

您可以构建模块但不能运行模块的事实意味着您没有将传递依赖项带入 Spring Boot fat jar 中。 Jackson 不会对元数据文件、类加载器等做任何奇怪的事情。它与胖 jar 中的其他人一起玩得很好。

鉴于您没有共享太多构建文件,确定是否有某些内容排除了 Jackson XML 模块的最简单方法是运行 jar -xvf target/app.jar 并检查输出以查看它是否在其中。

如果不是,请寻找与 Maven 依赖插件的依赖树目标等效的 Gradle,它将向您显示整个传递依赖树。如果它被排除在外,您肯定会在依赖项转储中看到它丢失。

【讨论】:

  • 为包含杰克逊依赖项的模块创建的 jar 仅包含我的生产代码,没有其他内容,没有依赖项中的类。这突出表明,我认为我可能需要以某种方式构建fatJar
猜你喜欢
  • 2019-09-02
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多