在Scala中使用软件包?

时间:2019-03-06 22:06:38

标签: scala

我有一个使用akka的scala项目。我希望整个项目都可以使用执行上下文。所以我创建了一个像这样的包对象:

resource_filename

在同一包中,我有这个文件:

.zip

但是,我收到编译器错误,找不到执行上下文或会话。我对package关键字的理解是该对象中的所有内容在整个包中都可用。但这似乎不起作用。感谢您能向我解释!

2 个答案:

答案 0 :(得分:1)

您的实现必须是这样的,希望对您有所帮助。

package.scala

package com.app.akka

package object connector {
  // Do some codes here..
}

CassandraService.scala

package com.app.akka
import com.app.akka.connector._

object CassandraService {
  def selectFromCassandra() = {
    // Do some codes here..
  }
}

答案 1 :(得分:1)

您的当前代码有两个问题。

  1. 编译包对象连接器时,它抛出错误以下

    错误:(14,35)递归值执行上下文需要类型    隐式val executeContext = executeContext 问题在于隐式val executeContext = executeContext行 该问题的解决方案如下。

    隐式val executeContext = ExecutionContext

  2. 当我们编译CassandraService时,它将引发如下错误

    错误:(17,13)找不到隐式的ExecutionContext。你可能会通过 方法的(隐式ec:ExecutionContext)参数 或导入scala.concurrent.ExecutionContext.Implicits.global。     rows.map {item =>

错误清楚地表明,我们要么需要将ExecutionContext作为隐式参数传递,要么需要导入scala.concurrent.ExecutionContext.Implicits.global。在我的系统中,两个问题均已解决,并且编译成功。我已附上代码供您参考。

package com.apache.scala

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import com.datastax.driver.core.Cluster
import scala.concurrent.ExecutionContext


package object connector {

  implicit val system = ActorSystem()
  implicit val mat = ActorMaterializer()

  implicit val executionContext = ExecutionContext

  implicit val session = Cluster
    .builder
    .addContactPoints("localhost")
    .withPort(9042)
    .build()
    .connect()

}

package com.apache.scala.connector

import akka.stream.alpakka.cassandra.scaladsl.CassandraSource
import akka.stream.scaladsl.Sink
import com.datastax.driver.core.{Row, SimpleStatement}

import scala.collection.immutable
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

object CassandraService {

  def selectFromCassandra() = {

    val statement = new SimpleStatement(s"SELECT * FROM animals.alpakka").setFetchSize(20)
    val rows: Future[immutable.Seq[Row]] = CassandraSource(statement).runWith(Sink.seq)

    rows.map{item =>
      print(item)

    }
  }

}