首页 > 解决方案 > Gradle 复合构建无法解决传递依赖

问题描述

我有一个依赖于库 B 的项目 A,我正在使用 gradle 复合构建。

项目 B 包含几个常见的依赖项,例如“org.apache.commons:commons-lang3”

项目 A 也使用“org.apache.commons:commons-lang3”,但传递依赖项解析不能像我预期的那样工作,我必须在项目的依赖项块中再次声明“org.apache.commons:commons-lang3”一个 build.gradle 以使其工作。

项目 A build.gradle:

group = 'org.example.app'
version = '0.1.0'

plugins {
   id 'java'
   id 'application' 
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
    }
}

dependencies {
    implementation 'org.example.libs:B'
}

项目 A settings.gradle

includeBuild '../../libs/B'

项目 B build.gradle:

group = 'org.example.libs'
version = '0.1.0

plugins {
   id 'java-library'
}

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(11))
    }
}

dependencies {
    implementation 'org.apache.commons:commons-lang3:3.12.0'
}

repositories {
    mavenCentral()
}

项目 B 可以独立编译,但如果不在其 build.gradle 中再次添加“org.apache.commons:commons-lang3:3.12.0”,我将无法编译项目 A。它不应该被解决为来自项目 B 的传递依赖吗?

项目 A 编译会引发错误,例如:

error: package org.apache.commons.lang3 does not exist

我错过了什么?

标签: javagradledependency-management

解决方案


这可能已经回答了很多次,但我找不到一个好的答案。

为了使传递依赖可用,您必须使用api而不是implementation在项目 B 中。

dependencies {
    api 'org.apache.commons:commons-lang3:3.12.0'
}

如果你以前有 maven 的经验,你需要忘记很多东西,因为 gradle 是一个非常不同的野兽,阅读手册是非常值得的(即使它有点乏味)


推荐阅读