scala - 以传递方式替换 Ivy 模块

标签 scala sbt ivy

我正在以编程方式使用 Ivy(在 SBT 的上下文中),我需要
能够将一小组模块替换为
具有不同组织但共享的兼容集
工件名称,修订等。

举一个具体的例子,我想替换,

org.scala-lang#scala-reflect;2.11.8

和,
org.typelevel#scala-reflect;2.11.8

依赖图中的任何地方。请注意,我只想添加一个
依赖 org.typelevel#scala-reflect;2.11.8 如果有
对 org.scala-lang#scala-reflect;2.11.8 某处的依赖
图表(我提前不知道),所以这还不够
无条件排除 org.scala-lang 模块并包含
org.typelevel 一。

这可能吗?如果是,指向必要机制的指针将
非常欢迎。如果不是,解决方法的建议也会
非常欢迎。

最佳答案

虽然这不是最干净的解决方案,但我认为您可以通过劫持项目解析器(负责解决 SBT 中的项目间依赖关系)来实现这一点。

在您的构建文件中的某处:

// ...
.settings(
  projectResolver <<= (projectDescriptors, streams) map { (m, s) =>
    new RawRepository(new ProjectResolver("custom-resolver", m) {
      import org.apache.ivy.core.module.descriptor.DependencyDescriptor
      import org.apache.ivy.core.resolve.ResolveData
      import org.apache.ivy.core.resolve.ResolvedModuleRevision

      override def getDependency(dd: DependencyDescriptor, data: ResolveData): ResolvedModuleRevision = {
        s.log.info("Resolving " + dd.getDependencyId.getName)

        // adjust your dependency descriptor and possibly resolve
        // from another source?

        super.getDependency(dd, data)
      }
    })
  }
)

这个新的项目解析器可以调整某些依赖描述符,然后根据常规解析器链解析它们……我想。您可能必须覆盖一些其他方法。

关于scala - 以传递方式替换 Ivy 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37411387/

相关文章:

scala - java.net.URISyntaxException。 sbt - 路径中的空间

java - 将 JaCoCo 添加到 Ivy?

java - 关于一个好的 Java 构建工具的建议,与 Eclipse 很好地集成

android - Maven 或 Ant + Ivy

Scala 组合函数不会终止

Scala Redis 驱动程序 - 使用 blpop 命令

build - 使用 'aggregate' 后跟 'dependsOn' 是否与相同的模块冗余?

scala - 找到 Spark 的 Scala 安装

java - 卡夫卡 : Publish message only if it doesn't already exist

scala - 如何对 sbt-assembly 构建的 jar 运行测试