我发现我的库的传递依赖项没有显示在应用程序中,尤其是当我的库中使用 maven BoM 时。
当没有 BoM 时,传递依赖出现在应用程序中。这是 3rd-party-lib 在 my-app 中正确显示为运行时依赖项的示例。
[my-app] --> [my-lib] --> [3rd-party-lib]
但是当我在我的库中使用 BoM(如下图所示)时,它不会在 my-app 中显示为运行时依赖项。这会导致运行时崩溃!
[my-app] --> [my-lib] --> [bom] --> [3rd-party-lib]
这是可重现此问题的代码:
// bom/build.gradle
plugins {
id 'java-platform'
id 'maven-publish'
}
publishing {
publications {
bom(MavenPublication) {
from components.javaPlatform
}
}
}
group "com.example"
version "0.0.3"
dependencies {
constraints {
api "com.jakewharton.timber:timber:4.7.1" // 3rd-party-lib
}
}
// mylibrary/build.gradle
apply plugin: 'com.android.library'
<<removed stuff for brevity>>
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
api platform("com.example:bom:0.0.3")
api "com.jakewharton.timber:timber"
}
// This helps to publish this library to maven local.
apply from: "https://raw.githubusercontent.com/sky-uk/gradle-maven-plugin/1.0.4/gradle-mavenizer.gradle"
// myapp/build.gradle
apply plugin: 'com.android.application'
<<removed stuff for brevity>>
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation "com.example:mylibrary:1.0.0"
}
在这种情况下,木材是 3rd-party-lib。如前所述,当 mylibrary 使用 BoM 时,这不会显示在应用程序中。因此,每当应用调用内部需要木材的库代码时,应用就会崩溃。
如何确保 mylibrary 将传递依赖项引入应用程序?
PS:我发布到 mylibrary 到本地的 maven。