为什么实施gradle dependecies接触消费者

时间:2018-06-18 18:47:31

标签: gradle

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
...

2 个答案:

答案 0 :(得分:1)

之所以没有这种行为,是因为您的依赖关系是通过Maven POM进行的。

Maven compileruntime范围的分隔仅为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),我可以观察文档描述的编译类路径更改(使用apiimplementation)。我已经放置了一个工作示例here