我试图使用sbt-assembly对某些依赖项进行阴影处理。正如在shaded github 自述文件中提到的那样,我已经为项目X发布了一个jar。当我试图在项目Y中使用已发布的jar时,我在runtime上得到了NoSuchMethodError错误。
下面是我用于项目X的遮阳规则
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,当我使用下面的遮阳规则时,
ShadeRule.rename("jawn.**" -> s"$shadePackage.jawn.@1").inAll它给出了项目Y运行时的以下错误,其中包括项目X jar作为依赖项。
java.lang.NoSuchMethodError: org.typelevel.jawn.Facade.$init$(Lorg/typelevel/jawn/Facade;)V但是当我像下面这样使用遮阳规则时,它可以正常工作。
ShadeRule.rename("org.typelevel.jawn.**" -> s"$shadePackage.org.typelevel.jawn.@1").inAll,在项目Y中,我使用下面的依赖项,这些依赖项与jawn具有传递依赖关系
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,如果有人能解释一下这里发生了什么,我会很感激的。
发布于 2022-03-02 07:37:48
我可以用下面的阴影来修复它
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做一个新的项目,
lazy val fatJar = project.settings(
commonSettings,
name := "my-project-fat",
Compile / packageBin := (library / assembly).value
)sbt packageBin将创建运行assembly阶段并创建胖jar。
详细信息也可以找到这里。
https://stackoverflow.com/questions/70741185
复制相似问题