Build 为什么';在编译/运行时类路径中是否包含可传递依赖项?

Build 为什么';在编译/运行时类路径中是否包含可传递依赖项?,build,build-system,dependency-management,Build,Build System,Dependency Management,我正在学习Gradle是如何工作的,我不明白它是如何解决项目可传递依赖关系的 目前,我有两个项目: projectA:它对外部库有一些依赖关系 projectB:它对projectA只有一个依赖项 无论我如何尝试,当我构建projectB时,gradle在projectB的编译或运行时类路径中不包含任何projectA依赖项(X和Y)。我只是通过在projectB的构建脚本中包含projectA的依赖项来实现它,在我看来这毫无意义。这些依赖项应自动附加到projectB。我很确定我错过了什么

我正在学习Gradle是如何工作的,我不明白它是如何解决项目可传递依赖关系的

目前,我有两个项目:

  • projectA:它对外部库有一些依赖关系
  • projectB:它对projectA只有一个依赖项
无论我如何尝试,当我构建projectB时,gradle在projectB的编译或运行时类路径中不包含任何projectA依赖项(X和Y)。我只是通过在projectB的构建脚本中包含projectA的依赖项来实现它,在我看来这毫无意义。这些依赖项应自动附加到projectB。我很确定我错过了什么,但我不知道是什么

我读过关于“lib依赖项”的文章,但它似乎只适用于所描述的本地项目,而不适用于外部依赖项

下面是我在根项目(同时包含projectA和projectB的项目)中使用的build.gradle:

这只涉及projectA:

version = '1.0'
dependencies {
    compile 'com.company:X:1.0'
    compile 'com.company:B:1.0'
}
这是projectB使用的一个:

version = '1.0'
dependencies {
    compile ('com.company:projectA:1.0') {
        transitive = true
    }
}

提前感谢您的帮助,请为我的英语不好向我道歉。

最后,问题不是来自脚本。我刚刚清除了gradle的缓存和每个项目的build文件夹,以使此工作正常。

将以下行放在projectB的依赖项中

编译项目(“:projectA”)

我知道这个问题的具体版本已经解决了,但是我的搜索把我带到了这里,我希望我能帮一些人省去解决这个问题的麻烦

错误的
foo/build.gradle
好的
foo/build.gradle
bar/build.gradle

实现
隐藏小部件依赖关系

api
使小部件依赖项可传递


发件人:

从:

api
配置中出现的依赖项将被删除 过渡地向图书馆的消费者公开,因此 出现在使用者的编译类路径上

实现
配置中找到的依赖项将在 另一方面,不会接触到消费者,因此不会泄漏到产品中 使用者的编译类路径。这有几个好处:

  • 依赖项不再泄漏到使用者的编译类路径中,因此您永远不会意外地依赖于传递类 依赖性
  • 由于减小了类路径大小,编译速度更快
  • 实现依赖项更改时减少重新编译:消费者不需要重新编译
  • cleaner publishing:当与新的maven publish插件结合使用时,Java库生成POM文件 准确区分根据 库以及在运行时使用库所需的内容(在其他情况下) 换句话说,不要混淆编译库本身所需的内容和 需要根据库进行编译)
编译配置仍然存在,但不应使用,因为它不会保证
api
实现
配置提供。


2件事:transitive在默认情况下是打开的,并且对同一个多模块项目中的另一个项目的依赖关系应该像这样指定:
编译项目(“:projectA”)
我有一个类似的问题。到目前为止,我还没能让它工作。我真的花了6个小时来试着让它工作,结果是缓存。我应该先去看看。谢谢我也有同样的问题,我使用的依赖项和你的一样,但是
api
并没有将其依赖项暴露给依赖项目,我在依赖项目中使用
实现
配置。虽然
compile
在依赖项目中使用时可以正常工作,但我在依赖项中定义了配置依赖项,一旦删除,它就成功了
version = '1.0'
dependencies {
    compile ('com.company:projectA:1.0') {
        transitive = true
    }
}
dependencies {
    implementation 'com.example:widget:1.0.0'
}
dependencies {
    api 'com.example:widget:1.0.0'
}
dependencies {
    implementation project(path: ':foo')
}
dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5'
}