是否可以在 sbt 中仅在一个包中隐藏一些包?

Is it possible to shade some package in only one package in sbt?

让我们考虑以下源代码:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.google.common.**" -> "my_package.@1")
   .inAll
)

它重命名 com.google.common 并更改包名称。此外,由于 inAll 它重写了 jar 中 all 类 中的所有导入和其他引用。它工作正常。然而,问题是:

是否可以只重写选定的参考文献?我的意思是我用路径来打包?

让我们这样说:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.google.common.**" -> "my_package.@1")
   .inPath("org.apache.spark")
)

我预计 只有 类 在 org.apache.spark 包下将被重写(它对 com.google.common 的引用)。

可以使用inLibrary方法实现。它的用法是:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.google.common.**" -> "my_package.@1") // it defines what/how to rewrite (belowe we define where to rewrite)
    .inLibrary("com.google.guava" % "guava" % "30.1-jre") // it rewrites references and packages names "com.google.common -> my_package.com.google.common")
    .inLibrary("org.apache.spark" % "spark-core" % "2.4.7") // it rewrites references (e.g. imports to guava from spark-core code)
)