具有以下多模块设置:
multi
├── projA
│ └── build.gradle.kts
├── projB
│ └── build.gradle.kts
├── build.gradle.kts
└── settings.gradle.kts
具有以下内容(缩写):
settings.gradle.kts
rootProject.name = "multi"
include("projA", "projB")
projA\build.gradle.kts
dependencies {
implementation("important-library:1.0")
}
projB\build.gradle.kts
dependencies {
implementation(project(":projA"))
}
为什么我不能从importantlibrary:1.0
访问那个projB
?
有效的方法:如果我在projA
中有一个使用该库的类,那么即使从projB
中的一个类调用了该类,它也可以很好地工作(因此间接访问有效)。无法直接从importantlibrary:1.0
中的projB
访问任何类(未解析的引用)。
我在这里想念什么?还是需要设置什么才能使其起作用?
版本版本:5.6.1
答案 0 :(得分:2)
我认为实现您想要的目标的一种好方法是使用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
答案 1 :(得分:1)
我发现有很多消息来源提到configuration
来处理如何处理传递性依存关系。深入研究发现,默认配置应使runtime
,runtimeOnly
和implementation
可用于引用项目。
或者我在这里误解了“默认”,或者您确实需要使用"default"
-配置显式调用它。在projB
中声明依赖关系,使得projA
的依赖关系也可用于projB
:
implementation(project(":projA", "default"))
// or with named parameters:
implementation(project(path = ":projA", configuration = "default"))
想知道这是否是真的,还是configuration
函数的project
参数的不幸默认值。
答案 2 :(得分:0)
有两个主题:依赖关系的传递性和/src
作为依赖关系
我们使用api
,以便可以将依赖项导出到更高级别的模块。
dependencies {
api("group", "name", "version")
}
dependencies {
implementation(project(":domain"))
implementation(project(":library_base"))
}
我们在第二个参数中传递"default"
作为配置,以便能够从较低的模块层次结构中导入/src
。
dependencies {
implementation(project(":common", "default"))
}
能够从:feature_a
到/src
的访问,例如:domain
使用"default"
作为配置,并且为了能够访问:library_base
的依赖关系,我们确保在该模块中使用api
定义了依赖关系,以便可以将其导出
GL