我正在学习Gradle如何工作,我无法理解它如何解决项目传递依赖。
目前,我有两个项目:
无论我如何尝试,当我构建projectB时,gradle不包含projectB的编译或运行时类路径中的任何projectA依赖项(X和Y)。我只是通过在projectB的构建脚本中包含projectA的依赖项来设法使它工作,在我看来这没有任何意义。这些依赖项应自动附加到projectB。我很确定我错过了什么,但我无法弄清楚是什么。
我读过“lib dependencies”,但它似乎只适用于描述here之类的本地项目,而不适用于外部依赖项。
这是我在根项目中使用的build.gradle(包含projectA和projectB的那个):
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.3'
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'idea'
group = 'com.company'
repositories {
mavenCentral()
add(new org.apache.ivy.plugins.resolver.SshResolver()) {
name = 'customRepo'
addIvyPattern "ssh://.../repository/[organization]/[module]/[revision]/[module].xml"
addArtifactPattern "ssh://.../[organization]/[module]/[revision]/[module](-[classifier]).[ext]"
}
}
sourceSets {
main {
java {
srcDir 'src/'
}
}
}
idea.module { downloadSources = true }
// task that create sources jar
task sourceJar(type: Jar) {
from sourceSets.main.java
classifier 'sources'
}
// Publishing configuration
uploadArchives {
repositories {
add project.repositories.customRepo
}
}
artifacts {
archives(sourceJar) {
name "$name-sources"
type 'source'
builtBy sourceJar
}
}
}
这只涉及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
}
}
提前感谢您的帮助,请为我的英语不好道歉。
答案 0 :(得分:2)
最后,问题不是来自脚本。我刚刚清除了gradle的缓存和每个项目的构建文件夹,以使其工作。
答案 1 :(得分:1)
将以下行放在projectB的依赖项中。
编译项目(':projectA')
答案 2 :(得分:0)
我知道这个特定版本的问题已经解决了,但是我的搜寻将我带到了这里,希望我可以省去一些人解决这个问题的麻烦。
foo/build.gradle
dependencies {
implementation 'com.example:widget:1.0.0'
}
foo/build.gradle
dependencies {
api 'com.example:widget:1.0.0'
}
bar/build.gradle
dependencies {
implementation project(path: ':foo')
}
implementation
隐藏小部件依赖项。
api
使小部件依赖项可传递。
来自https://stackoverflow.com/a/44493379/68086:
dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' }
在
api
配置中出现的依赖项将是 传递给图书馆的消费者,因此 出现在使用者的编译类路径上。在
implementation
配置中找到的依赖项将在 另一方面,不要暴露给消费者,因此不要泄漏到 消费者的编译类路径。这有几个好处:
- 依赖性不再泄漏到使用者的编译类路径中,因此您永远不会意外地依赖于传递对象 依赖
- 由于减小了类路径的大小,编译速度更快
当实现依赖关系发生变化时,- 无需重新编译:无需重新编译使用者
- 更清洁的发布:与新的maven-publish插件一起使用时,Java库生成的POM文件 准确区分需要针对哪些进行编译 库以及在运行时使用库所需的内容(其他 话,不要混用编译库本身所需的内容以及哪些内容 需要针对库进行编译)。
编译配置仍然存在,但不应使用,因为它不能保证
api
和implementation
配置提供。