【问题标题】:How to solve conflicting members in scala trait (org.slf4j.Logger/com.typesafe.scalalogging.Logger)如何解决 scala 特征中的冲突成员 (org.slf4j.Logger/com.typesafe.scalalogging.Logger)
【发布时间】:2021-06-28 18:08:00
【问题描述】:

我正在使用 Spark 2.1.1。这是我的问题:

我在同一个目录中有两个名为 tools 的文件。一个是 ma​​in_process.scala,另一个是 ma​​in_process_fun.scala。文件,基本上是这样的:

1.- main_process.scala:

package mod.pack.tools

import x.y.spark.InitSpark
import com.typesafe.config.Config

trait main_process extends InitSpark with main_process_fun {
  this: InitSpark  =>
  /**
    * @param spark  Initialized SparkSession
    * @param config Config retrieved from args
    */
  override def run(spark: SparkSession, config: Config): Int = {
    logger.info("LOG")
    implicit val sparkSes = spark

    pre_defined_f1(config).flatMap(cfg => pre_defined_f2(cfg).flatMap(pre_defined_f3(_, cfg))) match {
      case Success(_) =>
        logger.info("OK")
      case Failure(e) =>
        logger.info("ERROR")
    }
  }
}

2.- main_process_fun.scala:

package mod.pack.tools

import mod.pack.tools.another_folder.another_trait
import com.typesafe.config.Config

trait main_process_fun extends another_trait with com.typesafe.scalalogging.LazyLogging {

  def pre_defined_f1(conf: Config): Try[Config] = Try {
    blablabla
  }

  def pre_defined_f2(conf: Config)(implicit spark: SparkSession): Try[DataFrame] = Try {
    blablabla
    logger.info("LOG")
  }

  def pre_defined_f3(conf: Config): Column = {
    blablabla
    logger.info("LOG")
  }
}

尝试编译项目时出现错误。错误说:

trait main_process inherits conflicting members
lazy value logger in trait LazyLogging of type org.slf4j.Logger and
lazy value logger in trait LazyLogging of type com.typesafe.scalalogging.Logger
(Note: this can be resolved by declaring an override in trait main_process.)
trait main_process extends InitSpark with main_process_fun {

我已经尝试覆盖记录器,但收到以下错误消息:

lazy value logger has incompatible type

我也尝试导入 main_process_fun 而不是从 main_process 扩展它,但没有成功,我不知道是我做错了,还是这个想法本身不好解决这个问题。

非常感谢您帮助解决这个继承冲突!

顺便说一下,logger定义为:

package com.typesafe.scalalogging
trait LazyLogging extends scala.AnyRef {
 @scala.transient
 protected lazy val logger : com.typesafe.scalalogging.Logger = { /* compiled code */ }
}

【问题讨论】:

    标签: scala inheritance traits conflicting-libraries


    【解决方案1】:

    错误消息说明logger 有两个版本,一个在org.slf4j.Logger,另一个在com.typesafe.scalalogging.Logger。这些相互冲突,因此您需要删除一个。 InitSpark 似乎使用了其中的第一个,所以在第二个特征中也使用相同的类型:

    trait main_process_fun extends another_trait with org.slf4j.Logger {
    

    【讨论】:

      【解决方案2】:

      我在 Tim 的帮助下找到了解决方案!

      第一:

      trait main_process_fun extends another_trait {
      

      然后我导入了:

      import org.slf4j.LoggerFactory
      

      最后,在每个使用记录器值的方法中,我声明:

      val logger = LoggerFactory.getLogger(classOf[main_process_fun])
      

      谢谢!

      【讨论】:

        猜你喜欢
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 2011-05-12
        • 2018-05-15
        相关资源
        最近更新 更多