scala - 如何在 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"
)
以及最好的方法是什么(例如引用罐子)。
解决方案
是的,您可以使用简单的构建工具在 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
推荐阅读
- javascript - 对象数组的长度显示为 0,但它包含对象
- python - 按钮未放置在正确的框架中(TkInter)
- java - 尝试将数据从 servlet 发送到 java,但出现映射错误
- java - 保存模型时的 EMF 悬空参考
- cypress - 如何在使用过滤器时使用变量并包含在柏树中
- apache-camel - 如何使用 Camel Jetty 接收包含文件的 multipart/form-data 请求?
- sql-server - SQL Server 多对多没有主键关系
- julia - Julia Plots 动画`gif()` 无限期挂起
- macos - Mac Iterm2 上分支名称旁边的“*”是什么意思?
- excel - if x > y, but < yz 乘以 b 的 IF 函数