我有一个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的一部分删除库有什么意义呢?以及如何在所有项目中覆盖此行为?
答案 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")