在gradle依赖关系中,为什么API配置会丢弃所有传递依赖关系?

时间:2020-06-08 03:21:44

标签: gradle gradle-kotlin-dsl transitive-dependency

我有一个gradle项目,其中包含2个子项目:common和demo。

公共项目取决于已发布的库:

dependencies {

    implementation("eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0")
...

该演示项目依赖于common作为其API的一部分:

dependencies {

    api(project(":common")) {
        isTransitive =true
    }
}

当我同时编译两者时,会发现共同的正确依赖关系:

compileClasspath - Compile classpath for source set 'main'.
+--- org.scala-lang:scala-compiler:2.12.11
|    +--- org.scala-lang:scala-library:2.12.11
|    +--- org.scala-lang:scala-reflect:2.12.11
|    |    \--- org.scala-lang:scala-library:2.12.11
|    \--- org.scala-lang.modules:scala-xml_2.12:1.0.6
+--- org.scala-lang:scala-library:2.12.11
+--- org.scala-lang:scala-reflect:2.12.11 (*)
\--- eu.timepit:singleton-ops_2.12:0.5.0
     +--- org.scala-lang:scala-compiler:2.12.8 -> 2.12.11 (*)
     +--- org.scala-lang:scala-library:2.12.8 -> 2.12.11
     \--- com.chuusai:shapeless_2.12:2.3.3
          +--- org.scala-lang:scala-library:2.12.4 -> 2.12.11
          \--- org.typelevel:macro-compat_2.12:1.1.1
               \--- org.scala-lang:scala-library:2.12.0 -> 2.12.11

但是在演示中,常见的传递依赖项是空的!

compileClasspath - Compile classpath for source set 'main'.
+--- project :common
+--- org.scala-lang:scala-compiler:2.12.11
...

这会导致非常常见的类路径丢失错误,例如:

[Error] /xxx/DoubleVectorDemo.scala:9: Symbol 'type shapeless.ProductArgs' is missing from the classpath.
This symbol is required by 'object edu.umontreal.kotlingrad.shapesafe.tensor.DoubleVector'.
Make sure that type ProductArgs is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
A full rebuild may help if 'DoubleVector.class' was compiled against an incompatible version of shapeless.

那么为您的API的一部分删除库有什么意义呢?以及如何在所有项目中覆盖此行为?

1 个答案:

答案 0 :(得分:2)

从gradle java-plugin文档中

应该使用api配置声明由库API导出的依赖关系,而应该使用实现配置声明组件内部的依赖关系。 api配置中出现的依赖项将传递给库的使用者,并因此出现在使用者的编译类路径上。另一方面,在实现配置中找到的依赖项不会暴露给使用者,因此不会泄漏到使用者的编译类路径中

让我们说您想向所有公共库公开eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0,然后您需要在公共模块build.gradle.kts中将其添加为api依赖项。

dependencies {

api("eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0")
相关问题