首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在gradle依赖项中,为什么API配置放弃所有传递依赖项?

在gradle依赖项中,为什么API配置放弃所有传递依赖项?
EN

Stack Overflow用户
提问于 2020-06-08 03:21:44
回答 1查看 408关注 0票数 0

我有一个gradle项目,包含两个子项目:公共和演示。

公共项目依赖于已发布的库:

代码语言:javascript
复制
dependencies {

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

演示项目依赖于公共API的一部分:

代码语言:javascript
复制
dependencies {

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

在编译这两者时,我观察到正确的依赖关系是相同的:

代码语言:javascript
复制
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

但是在演示中,公共下的传递依赖是空的!

代码语言:javascript
复制
compileClasspath - Compile classpath for source set 'main'.
+--- project :common
+--- org.scala-lang:scala-compiler:2.12.11
...

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

代码语言:javascript
复制
[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的一部分而丢弃库有什么意义呢?以及如何在所有项目中推翻这种行为?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-08 05:07:42

来自gradle java插件医生,

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

假设您希望将eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0公开给所有公共库,那么您需要将其作为api依赖项添加到公共模块build.gradle.kts中。

代码语言:javascript
复制
dependencies {

api("eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62254490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档