java-library plugin documentation说:
api配置中出现的依赖关系将被传递给库的使用者,因此将出现在使用者的编译类路径中。 另一方面,在实现配置中发现的依赖性将不会暴露给消费者,因此不会泄漏到消费者手中。编译类路径
然而,它对我不起作用。我看到实现依赖性也暴露给消费者 这里有一个例子:
project_a - >的build.gradle
...
dependencies {
// Dependency supposedly not exposed to consumers in their own classpath compilation
implementation 'com.google.guava:guava:23.0'
}
...
project_b - >的build.gradle
...
dependencies {
implementation 'my-company:project_a:1.0'
}
...
我预计番石榴不会出现在项目中。类路径。但是我在project_b编译类路径中看到了guava及其所有依赖项。
project_b>> gradlew依赖项:
...
compileClasspath - Compile classpath for source set 'main'.
\--- my-company:project_a:1.0
\--- com.google.guava:guava:23.0
+--- com.google.code.findbugs:jsr305:1.3.9
+--- com.google.errorprone:error_prone_annotations:2.0.18
+--- com.google.j2objc:j2objc-annotations:1.1
\--- org.codehaus.mojo:animal-sniffer-annotations:1.14
...
答案 0 :(得分:1)
之所以没有这种行为,是因为您的依赖关系是通过Maven POM进行的。
Maven compile
和runtime
范围的分隔仅为supported as of Gradle 4.6,目前位于功能标志的后面。
简而言之,如果将以下内容添加到settings.gradle
的{{1}}中,您将获得预期的行为:
project_b
答案 1 :(得分:-1)
我认为文档是指多项目构建,并且使用者被认为是依赖于构建中的另一个项目的项目(而不是jar)。
例如,请考虑此project_b/build.gradle
:
dependencies {
implementation project(':project_a')
}
使用此(以及相应的settings.gradle
),我可以观察文档描述的编译类路径更改(使用api
与implementation
)。我已经放置了一个工作示例here。