Как сослаться на местный проект в Scala - PullRequest
0 голосов
/ 07 мая 2018

Прежде всего, извинения, если на этот вопрос уже был дан ответ, или если есть полная документация / учебник по этому вопросу, я новичок в Scala, и я наверняка что-то пропустил.

У меня есть опыт работы с C #, и я пытаюсь расширить свои знания, изучая Scala. Я хотел бы включить микросервис Scala в архитектуру микросервисов, которая фактически построена с использованием проектов .NET. Для реализации общего архитектурного кода в проектах .NET я разработал серию базовых проектов, на которые ссылаются все проекты микросервисов, и эта операция с VS была довольно простой, но я не смог понять, как добиться той же функциональности в Scala .

В частности, я хотел бы понять, существует ли способ ссылки на проект A, расположенный в локальной папке в проекте B, аналогичным способом ссылки на проект из 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"
)

и как лучше всего это сделать (например, сослаться на банки).

1 Ответ

0 голосов
/ 07 мая 2018

Да, вы можете ссылаться на другой проект 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...