是否可以在 sbt 中仅在一个包中遮蔽某些包?

Posted

技术标签:

【中文标题】是否可以在 sbt 中仅在一个包中遮蔽某些包?【英文标题】:Is it possible to shade some package in only one package in sbt? 【发布时间】:2021-04-19 22:25:13 【问题描述】:

让我们考虑以下源代码:

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 包下的only 类会被重写(它对com.google.common 的引用)。

【问题讨论】:

那么?有什么问题? 有没有可能达到我指出的效果? inPath 不存在。仅为示例,请仔细阅读。 ShadeRule.rename("org.apache.commons.io.**" -> "shadeio.@1").inLibrary("commons-io" % "commons-io" % "2.4") 【参考方案1】:

可以使用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)
)

【讨论】:

以上是关于是否可以在 sbt 中仅在一个包中遮蔽某些包?的主要内容,如果未能解决你的问题,请参考以下文章

SBT中已发布的程序集包中的未解析依赖项

为什么在我的build.sbt中没有正确遮蔽番石榴?这里

在 sbt-native-packager 的通用包中更改名称

如何从 sbt 的包中排除程序集?

如何在sbt测试中仅显示失败的测试?

war包运行偶尔漏掉部分程序