首页 > 解决方案 > 如何在 Scala 中引用本地项目

问题描述

首先,如果这个问题已经得到回答,或者如果有完整的文档/教程,我很抱歉,我是一个 Scala 新手,我肯定错过了一些东西。

我有 C# 背景,我正在尝试扩展我学习 Scala 的知识。我想在实际上使用 .NET 项目构建的微服务架构中包含一个 Scala 微服务。为了在 .NET 项目中实现共享架构代码,我开发了一系列基础项目,被所有微服务项目引用,使用 VS 的操作非常简单,但我无法掌握如何在 Scala 上实现相同的功能.

特别是,我想了解是否有一种方法可以引用位于项目 B 的本地文件夹中的项目 A,类似于从 Maven 中引用项目的方式,例如:

libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-http-spray-json"   % "10.1.1",
    "com.typesafe.akka" %% "akka-http"   % "10.1.1",
    "com.typesafe.akka" %% "akka-stream" % "2.5.11"
)

以及最好的方法是什么(例如引用罐子)。

标签: scalasbt

解决方案


是的,您可以使用简单的构建工具在 scala 中引用另一个 scala 项目。

假设你的架构有

1) ChatMicroserviceApi.jar (depends on two local jars 2 and 3)
2) ChatMicroserviceSchema.jar
3) ChatMicroserviceExternalDeps.jar

然后您的 sbt 脚本将如下所示。我sbt-assembly用来创建你必须添加addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")的胖罐子project/plugins.sbt

//build.sbt

name := "ChatMicroserviceParent"
organization in ThisBuild := "com.microservice.chat"
scalaVersion in ThisBuild := "2.12.5"

version := "1.0-SNAPSHOT"

//define what parent consists of in aggregate section
lazy val ChatMicroserviceParent = project
  .in(file("."))
  .settings(settings)
  .aggregate(ChatMicroserviceSchema,
             ChatMicroserviceExternalDeps,
             ChatMicroserviceApi)

//creates schema.jar
lazy val ChatMicroserviceSchema =
  project.settings(name := "ChatMicroserviceSchema",
                   publishMavenStyle := true,
                   settings,
                   apiSchemaAssemblySettings)

//creates external-deps.jar
lazy val ChatMicroserviceExternalDeps =
  project.settings(
    name := "ChatMicroserviceExternalDeps",
    publishMavenStyle := true,
    settings,
    apiSchemaAssemblySettings,
    libraryDependencies ++= Seq(
      "com.softwaremill.sttp" %% "core" % "1.1.12",
      "com.softwaremill.sttp" %% "async-http-client-backend-future" % "1.1.12"
        exclude ("org.asynchttpclient", "async-http-client"),
      "org.asynchttpclient" % "async-http-client" % "2.4.4"
        excludeAll( ExclusionRule(organization = "io.netty") ),
      "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.5",
      "com.fasterxml.jackson.module" % "jackson-modules-java8" % "2.9.5",
      "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.9.5",
      "com.fasterxml.jackson.datatype" % "jackson-datatype-jdk8" % "2.9.5"
    )
  )

val NettyVersion = "4.1.16.Final"

//creates api.jar which depends on schema.jar and external-deps.jar
lazy val ChatMicroserverApi = project
  .settings(
    name := "ChatMicroserverApi",
    settings,
    apiAssemblySettings,
    libraryDependencies ++= Seq(
      "com.github.finagle" %% "finch-core" % "0.18.0"
        excludeAll( ExclusionRule(organization = "io.netty") )
        exclude ("com.fasterxml.jackson.core", "jackson-databind"),
      "com.github.finagle" %% "finch-circe" % "0.18.0",
      "io.netty" % "netty-codec" % NettyVersion,
      "io.netty" % "netty-codec-http" % NettyVersion,
      "io.netty" % "netty-codec-http2" % NettyVersion,
      "io.netty" % "netty-transport" % NettyVersion,
      "io.netty" % "netty-buffer" % NettyVersion,
      "io.netty" % "netty-common" % NettyVersion,
      "io.netty" % "netty-resolver" % NettyVersion,
      "io.netty" % "netty-handler" % NettyVersion,
      "io.netty" % "netty-handler-proxy" % NettyVersion,
      "io.netty" % "netty-transport-native-unix-common" % NettyVersion,
      "io.netty" % "netty-transport-native-epoll" % NettyVersion,
      "io.netty" % "netty-tcnative-boringssl-static" % "2.0.6.Final",
      "io.netty" % "netty-codec-socks" % NettyVersion,
      "io.circe" %% "circe-generic" % "0.9.3",
      "com.typesafe" % "config" % "1.3.3",
      "ch.qos.logback" % "logback-classic" % "1.2.3",
      "com.typesafe.akka" %% "akka-actor" % "2.5.12",
      "com.typesafe.akka" %% "akka-stream" % "2.5.12",
      "com.typesafe.akka" %% "akka-http" % "10.1.1",
      "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.5",
      "com.fasterxml.jackson.module" % "jackson-modules-java8" % "2.9.5",
      "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.9.5",
      "com.fasterxml.jackson.datatype" % "jackson-datatype-jdk8" % "2.9.5",
      "io.circe" %% "circe-java8" % "0.9.3",
      "com.softwaremill.sttp" %% "core" % "1.1.12",
      "org.asynchttpclient" % "async-http-client" % "2.4.4"
        excludeAll( ExclusionRule(organization = "io.netty") ),
      "com.softwaremill.sttp" %% "async-http-client-backend-future" % "1.1.12"
        exclude ("org.asynchttpclient", "async-http-client"),
      "joda-time" % "joda-time" % "2.9.9"
    )
  )
  .dependsOn(ChatMicroserviceExternalDeps, ChatMicroserviceSchema)

lazy val commonDependencies = Seq()

lazy val settings =
  commonSettings

lazy val compilerOptions = Seq(
  "-unchecked",
  "-feature",
  "-language:existentials",
  "-language:higherKinds",
  "-language:implicitConversions",
  "-language:postfixOps",
  "-deprecation",
  "-encoding",
  "utf8"
)

lazy val commonSettings = Seq(
  scalacOptions ++= compilerOptions,
  resolvers ++= Seq(
    Resolver.sonatypeRepo("releases"),
    Resolver.sonatypeRepo("snapshots")
  )
)


lazy val apiAssemblySettings = Seq(
  assemblyJarName in assembly := name.value + "-" + version.value + ".jar",
  mainClass in assembly := Some(
    "com.microservice.MainServerClass"),
  assemblyMergeStrategy in assembly := {
    case PathList("reference.conf")    => MergeStrategy.concat
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case _                             => MergeStrategy.first
  }
)

lazy val apiSchemaAssemblySettings = Seq(
  assemblyJarName in assembly := name.value + "-" + version.value + ".jar")
assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case _                             => MergeStrategy.first
}

lazy val apiExternalDepsAssemblySettings = Seq(
  assemblyJarName in assembly := name.value + "-" + version.value + ".jar")
assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case _                             => MergeStrategy.first
}

这是可能有帮助的工作示例 - https://github.com/duwamish-os/chat-server


推荐阅读