我想用带有更多参数的自定义类替换库中的案例类。
我不想从库中排除任何内容。我正在做的是在我的项目上创建一个具有相同包名称的类,但它在运行时引发错误。
示例:
- 库:
mamilo.rosa.jar:/com/mamilo/rosa/CaseClassA.scala
- 我的项目:
src/scala/com/mamilo/rosa/CaseClassA.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/