具有以下多模块设置:
multi
├── projA
│ └── build.gradle.kts
├── projB
│ └── build.gradle.kts
├── build.gradle.kts
└── settings.gradle.kts
包含以下内容(简称(:
settings.gradle.kts
rootProject.name = "multi" include("projA", "projB")
projAbuild.gradle.kts
dependencies { implementation("important-library:1.0") }
projBbuild.gradle.kts
dependencies { implementation(project(":projA")) }
为什么我无法访问projB
的importantlibrary:1.0
?
什么有效:如果我在projA
中有一个使用该库的类,即使该类是从projB
中的类调用的,它也能完美运行(因此间接访问有效(。从projB
中的importantlibrary:1.0
直接访问任何类都不起作用(未解析的引用(。
我在这里错过了什么?或者需要设置什么才能使其正常工作?
格拉德尔版本:5.6.1
我认为实现您想要的目标的一个好方法是使用api
而不是implementation
。implementation
旨在仅将依赖项保留在模块内,而api
旨在将它们与模块一起导出。然后,projA
的依赖项将变为:
dependencies {
api("important-library:1.0")
}
这是官方文档的链接:https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation
我发现很多来源都提到了如何处理传递依赖关系configuration
。深入挖掘,我发现默认配置应该使runtime
、runtimeOnly
和implementation
可用于引用项目。
要么我在这里误解了"默认",要么你真的需要使用"default"
-configuration 显式调用它。在projB
中按如下方式声明依赖关系,使projA
的依赖关系也可供projB
使用:
implementation(project(":projA", "default"))
// or with named parameters:
implementation(project(path = ":projA", configuration = "default"))
想知道这是否真的是/是有意的,或者这是否是project
函数的configuration
参数的
有 2 个主题:依赖项的传递性和作为依赖项的/src
-
依赖关系传递性
我们使用api
以便可以将依赖项导出到模块的更高层次结构。
build.gradle.kts (:library_base(
dependencies {
api("group", "name", "version")
}
build.gradle.kts (:common(
dependencies {
implementation(project(":domain"))
implementation(project(":library_base"))
}
/src 作为依赖项的传递性
我们将第二个参数中的"default"
作为配置传递,以便能够从模块的较低层次结构导入/src
。
build.gradle.kts (:feature_a(
dependencies {
implementation(project(":common", "default"))
}
能够从:feature_a
访问到例如/src
。:domain
我们使用"default"
作为配置并能够访问:library_base
的依赖项,我们确保它们在该模块中使用api
定义,以便可以导出它们。
GL
源