【发布时间】: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