我有一个gradle项目,包含两个子项目:公共和演示。
公共项目依赖于已发布的库:
dependencies {
implementation("eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0")
...演示项目依赖于公共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的一部分而丢弃库有什么意义呢?以及如何在所有项目中推翻这种行为?
发布于 2020-06-08 05:07:42
来自gradle java插件医生,
API配置应该用于声明库api导出的依赖项,而实现配置应该用于声明组件内部的依赖项。api配置中出现的依赖项将向库的使用者临时公开,因此将出现在使用者的编译类路径上。另一方面,在实现配置中找到的依赖项不会暴露给使用者,因此不会泄漏到使用者的编译类路径中。
假设您希望将eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0公开给所有公共库,那么您需要将其作为api依赖项添加到公共模块build.gradle.kts中。
dependencies {
api("eu.timepit:singleton-ops_${vs.scalaBinaryV}:0.5.0")https://stackoverflow.com/questions/62254490
复制相似问题