首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sbt-程序集NoSuchMethodError在运行时着色时

sbt-程序集NoSuchMethodError在运行时着色时
EN

Stack Overflow用户
提问于 2022-01-17 12:15:01
回答 1查看 196关注 0票数 1

我试图使用sbt-assembly对某些依赖项进行阴影处理。正如在shaded github 自述文件中提到的那样,我已经为项目X发布了一个jar。当我试图在项目Y中使用已发布的jar时,我在runtime上得到了NoSuchMethodError错误。

下面是我用于项目X的遮阳规则

代码语言:javascript
复制
 val shadePackage = "mycompany.spark.v1.shaded"
  Seq(
    ShadeRule.rename("cats.**" -> s"$shadePackage.cats.@1").inAll,
    ShadeRule.rename("com.mycompany.sdk.scala.**" -> s"$shadePackage.sdk.scala.@1").inAll,
    ShadeRule.rename("com.google.protobuf.**" -> s"$shadePackage.com.google.protobuf.@1").inAll,
    ShadeRule.rename("fs2.**" -> s"$shadePackage.fs2.@1").inAll,
    ShadeRule.rename("io.circe.**" -> s"$shadePackage.io.circe.@1").inAll,
    ShadeRule.rename("jawn.**" -> s"$shadePackage.jawn.@1").inAll, <==============
    ShadeRule.rename("shapeless.**" -> s"$shadePackage.shapeless.@1").inAll,
    ShadeRule.rename("sttp.client3.**" -> s"$shadePackage.sttp.client3.@1").inAll,
  )

对于jawn,当我使用下面的遮阳规则时,

代码语言:javascript
复制
ShadeRule.rename("jawn.**" -> s"$shadePackage.jawn.@1").inAll

它给出了项目Y运行时的以下错误,其中包括项目X jar作为依赖项。

代码语言:javascript
复制
java.lang.NoSuchMethodError: org.typelevel.jawn.Facade.$init$(Lorg/typelevel/jawn/Facade;)V

但是当我像下面这样使用遮阳规则时,它可以正常工作。

代码语言:javascript
复制
ShadeRule.rename("org.typelevel.jawn.**" -> s"$shadePackage.org.typelevel.jawn.@1").inAll,

在项目Y中,我使用下面的依赖项,这些依赖项与jawn具有传递依赖关系

代码语言:javascript
复制
val CirceVersion = "0.14.0"
val Http4sVersion = "0.22.2"

"org.http4s" %% "http4s-blaze-client" % Http4sVersion,
"org.http4s" %% "http4s-circe" % Http4sVersion,

"io.circe" %% "circe-generic" % CirceVersion,
"io.circe" %% "circe-derivation" % CirceVersion,
"io.circe" %% "circe-literal" % CirceVersion,
"io.circe" %% "circe-generic-extras" % CirceVersion,

如果有人能解释一下这里发生了什么,我会很感激的。

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 07:37:48

我可以用下面的阴影来修复它

代码语言:javascript
复制
assemblyShadeRules := {
  val shadePackage = "shaded"
  Seq(
    ShadeRule.rename("cats.**" -> s"$shadePackage.cats.@1").inAll,
    ShadeRule.rename("com.google.protobuf.**" -> s"$shadePackage.com.google.protobuf.@1").inAll,
    ShadeRule.rename("fs2.**" -> s"$shadePackage.fs2.@1").inAll,
    ShadeRule.rename("io.circe.**" -> s"$shadePackage.io.circe.@1").inAll,
    ShadeRule.rename("org.typelevel.jawn.**" -> s"$shadePackage.org.typelevel.jawn.@1").inAll,
    ShadeRule.rename("shapeless.**" -> s"$shadePackage.shapeless.@1").inAll,
    ShadeRule.rename("sttp.client3.**" -> s"$shadePackage.sttp.client3.@1").inAll,
  )
},

在sbt做一个新的项目,

代码语言:javascript
复制
lazy val fatJar = project.settings(
  commonSettings,
  name := "my-project-fat",
  Compile / packageBin := (library / assembly).value
)

sbt packageBin将创建运行assembly阶段并创建胖jar。

详细信息也可以找到这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70741185

复制
相关文章

相似问题

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