我如何在特定jar中强制使用类,并在build.sbt中排除另一个jar的相同类?

问题描述 投票:1回答:1

我有两个asm依赖项,它们具有完全相同的类名和不同的依赖项所包含的项目结构。尽管这些库具有相同的项目结构,但它们具有不同的Maven坐标。因此,依赖项覆盖将不起作用。

我的一个依赖项(jnr-ffi)使用jnr-ffi类。在org.objectweb.asm.ClassVisitor中,"org.objectweb" % "asm" % "3.3.1"是一个接口,这会引发错误。我需要使用org.objectweb.asm.ClassVisitor"org.ow2.asm" % "asm" % "5.0.3"实现,因为它是一个实际的类。两种实现的jar都下载到org.objectweb.asm.ClassVisitor中。不幸的是,鉴于我的合并策略,我没有使用我需要的那个。

引发以下错误:

~/.ivy2/cache

我正在使用Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.objectweb.asm.ClassVisitor, but class was expected at jnr.ffi.provider.jffi.AsmLibraryLoader.generateInterfaceImpl(AsmLibraryLoader.java:104) at jnr.ffi.provider.jffi.AsmLibraryLoader.loadLibrary(AsmLibraryLoader.java:89) at jnr.ffi.provider.jffi.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:43) at jnr.ffi.LibraryLoader.load(LibraryLoader.java:325) at jnr.unixsocket.Native.<clinit>(Native.java:80) at jnr.unixsocket.UnixSocketChannel.<init>(UnixSocketChannel.java:101) at jnr.unixsocket.UnixSocketChannel.open(UnixSocketChannel.java:65) 0.13.5和sbt 0.14.2。

我尝试排除sbt assembly。这不起作用:

"org.objectweb" % "asm" % "3.3.1"

我也尝试使用以下合并策略

libraryDependencies ++= Seq(. . .).map(_.exclude("org.objectweb" % "asm" % "3.3.1"))

我也尝试过排除罐子:

    assemblyMergeStrategy in assembly := {
      case PathList("asm-3.2.jar") => MergeStrategy.discard
      case PathList(ps @ _*) if ps.last endsWith ".asm-3.2.jar" => MergeStrategy.discard
      case PathList("asm-5.0.3.jar") => MergeStrategy.first
      case PathList(ps @ _*) if ps.last endsWith ".asm-5.0.3.jar" => MergeStrategy.first
      case PathList("META-INF", xs @ _*) => MergeStrategy.discard
      case x => MergeStrategy.first
    }

我也尝试从 assemblyExcludedJars in assembly := { val cp = (fullClasspath in assembly).value cp filter {_.data.getName == "asm-3.2.jar"} } 实现自定义合并策略project/IncludeFromJar.scala。但是"How can a duplicate class be excluded from sbt assembly?"无法编译,我相信它是因为我为他们的示例使用了错误的IncludeFromJar.scala版本。

sbt assembly

因此问题:如何在特定jar中强制使用某个类,并在build.sbt中排除另一个jar的同一类?

scala sbt sbt-assembly jnr
1个回答
0
投票

我最近遇到了类似的问题。我发现的解决方案是使用依赖项着色进行组装。这是我在case PathList("org", "objectweb", "asm", "ClassVisitor.class") => new IncludeFromJar("asm-5.0.3.jar")文件中使用的设置。

build.sbt

assemblyShadeRules in assembly := Seq( ShadeRule.rename("org.objectweb.asm.**" -> "asm503.@1").inLibrary( "org.ow2.asm" % "asm" % "5.0.3" ).inLibrary( "org.ow2.asm" % "asm-tree" % "5.0.3" ).inLibrary( "org.ow2.asm" % "asm-analysis" % "5.0.3" ).inLibrary( "org.ow2.asm" % "asm-commons" % "5.0.3" ).inLibrary( "org.ow2.asm" % "asm-util" % "5.0.3" ).inLibrary( "com.github.jnr" % "jnr-ffi" % "2.1.9" ).inProject // For your own code ) 语句也可以阴影自己的导入(如果需要)。

我知道线程很旧,但这可能会对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.