我正在学习 Gradle 的工作原理,但我无法理解它如何解决项目传递依赖关系。
现在,我有两个项目:
- projectA :它对外部库有一些依赖项
- 项目:仅对项目有一个依赖项
无论我如何尝试,当我构建projectB时,gradle都不在projectB的编译或运行时类路径中包含任何projectA依赖项(X和Y)。我只能通过将projectA的依赖项包含在projectB的构建脚本中来使其工作,在我看来,这没有任何意义。这些依赖项应自动附加到projectB。我很确定我错过了一些东西,但我不知道是什么。
我读过有关“lib依赖项”的内容,但它似乎仅适用于所描述的本地项目here http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:project_jar_dependencies,而不是外部依赖。
这是我在根项目(同时包含projectA和projectB的项目)中使用的build.gradle:
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
}
}
}
这仅涉及项目A:
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
}
}
预先感谢您的帮助,请为我糟糕的英语道歉。
我知道这个问题的具体版本已经解决了,但是我的搜索把我带到了这里,我希望我可以为一些人省去解决这个问题的麻烦。
Bad foo/build.gradle
dependencies {
implementation 'com.example:widget:1.0.0'
}
Good foo/build.gradle
dependencies {
api 'com.example:widget:1.0.0'
}
bar/build.gradle
dependencies {
implementation project(path: ':foo')
}
implementation
隐藏小部件依赖项。
api
使小部件依赖项具有传递性。
From https://stackoverflow.com/a/44493379/68086 https://stackoverflow.com/a/44493379/68086:
来自Gradle 文档 https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation:
dependencies {
api 'commons-httpclient:commons-httpclient:3.1'
implementation 'org.apache.commons:commons-lang3:3.5'
}
出现在的依赖关系api
配置将是
间接地暴露给图书馆的消费者,因此将
出现在消费者的编译类路径上。
发现依赖关系implementation
配置将在
另一方面,不会暴露给消费者,因此不会泄漏到
消费者的编译类路径。这有几个好处:
- 依赖项不会再泄漏到消费者的编译类路径中,因此您永远不会意外地依赖于传递性
依赖性
- 由于类路径大小减小,编译速度更快
- 当实现依赖关系发生变化时,重新编译次数减少:消费者不需要重新编译
- 更干净的发布:当与新的 maven-publish 插件结合使用时,Java 库会生成以下 POM 文件:
准确区分编译所需的内容
库以及在运行时使用该库需要什么(在其他情况下)
换句话说,不要混合编译库本身所需的内容和
需要针对库进行编译)。
编译配置仍然存在,但不应使用,因为它不能保证api
and implementation
配置提供。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)