java - SBT scala 猴子补丁库

标签 java scala sbt monkeypatching

我想用带有更多参数的自定义类替换库中的案例类。

我不想从库中排除任何内容。我正在做的是在我的项目上创建一个具有相同包名称的类,但它在运行时引发错误。

示例:

  • 库:mamilo.rosa.jar:/com/mamilo/rosa/Cas​​eClassA.scala
  • 我的项目:src/scala/com/mamilo/rosa/Cas​​eClassA.scala

我想要做的是从库中删除该类或用我的类替换它,但它仍然会引发运行时错误:

java.lang.NoSuchMethodError: com.mamilo.rosa.CaseClassA.<init>(Lscala/collection/Seq;...)

编辑

我正在尝试向此案例类添加一个新参数:https://github.com/sksamuel/elastic4s/blob/master/elastic4s-core/src/main/scala/com/sksamuel/elastic4s/searches/SearchDefinition.scala

它将被使用并转换为 HTTP 请求(我也会尝试覆盖)。我想做的是在他的库上添加一些更改,当它变得良好时,我可以提交包含一些更改的 PR,但我正在包含此库作为依赖项的项目上执行此操作。

最佳答案

这里有两个选择:

1) 添加隐式类转换,例如RichSearchDefinition,当隐式转换在范围内时,它允许您使用自己的方法。这被称为“丰富我的图书馆”(或有时“拉皮条我的图书馆”)模式。代码大致如下:

object Implicits {
  implicit class RichSearchDefiniton(sd: SearchDefinition) {
    // Define methods here that you'd like to use on `SearchDefinition`
    def printSomething: Unit = println("This is an example of enriching a library.")
  }
}

无论您在哪里需要此功能,都可以简单地导入隐式转换:import mypackage.Implicits._

2) 在本地对库进行更改,将版本号更改为 0.0.1-LOCAL 之类的内容,然后使用 sbtpublishLocal 发布其本地副本。在您的项目中,您可以依赖这个本地发布的库。当您对它的工作效果感到满意时,您可以提交包含更改的拉取请求。这里需要注意的是,如果通过另一个依赖项传递地包含 elastic4s ,则必须 exclude它在您的 build.sbt 文件中

关于java - SBT scala 猴子补丁库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446170/

相关文章:

scala - Scala中的右关联方法有什么用?

playframework - 自定义 logback 适配器类仅在 jar 文件中找到

由于我使用依赖注入(inject),Scala play 2.5 测试未运行

scala - 如何在 SBT 中的 onLoad Hook 上应用设置更改?

java - 如何在 Websphere V7 中以编程方式在运行时修改跟踪服务?

c# - 使用 JavaWS 服务时可以查看 .NET 生成的 XML 吗?

scala - If-Then-Else DSL - 定义隐式来区分两种返回类型

java - 在 spring.xml 中加密数据库密码

java - 由 : java. io.IOException 引起:无法锁定使用跟踪假脱机文件

scala - 泛型函数类型中的通用量化